SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系,

其中一对多是一种比较常见的关系。利用flask sqlalchemy实现一对多的关系如下:

1. 建立数据库的模型

在本次试验中建立三个表: user, phone ,atttr。user 和phone, phone 和atttr均为一对多的关系。实现如下:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from flask import Flask
  5. from flask.ext.sqlalchemy import SQLAlchemy
  6.  
  7. app = Flask(__name__)
  8.  
  9. # 配置数据库
  10. app.config[
  11. 'SQLALCHEMY_DATABASE_URI'] = \
  12. "mysql://root: root@127.0.0.1/test?charset=utf8"
  13. db = SQLAlchemy(app)
  14.  
  15. # 建立user表
  16. class Usr(db.Model):
  17. __tablename__ = 'usr'
  18. id = db.Column(db.Integer, primary_key=True)
  19. usrname = db.Column(db.String(80), unique=True)
  20. email = db.Column(db.String(120), unique=True)
  21. phone = db.relationship('Phone', backref='user', lazy='dynamic')
  22.  
  23. def __init__(self, username, email):
  24. self.usrname = username
  25. self.email = email
  26.  
  27. class Phone(db.Model):
  28. id = db.Column(db.Integer, primary_key=True)
  29. name = db.Column(db.String(20))
  30. factory = db.Column(db.String(20))
  31. userId = db.Column(db.Integer, db.ForeignKey('usr.id'))
  32. attr = db.relationship(
  33. 'Atttr', backref='phone', lazy='dynamic')
  34.  
  35. def __init__(self, name, factory, userId):
  36. self.name = name
  37. self.factory = factory
  38. self.userId = userId
  39.  
  40. class Atttr(db.Model):
  41. id = db .Column(db.Integer, primary_key=True)
  42. color = db.Column(db.String(20))
  43. price = db.Column(db.String(20))
  44. macId = db.Column(db.Integer, db.ForeignKey('phone.id'))
  45.  
  46. def __init__(self, color, price, macId):
  47. self.color = color
  48. self.price = price
  49. self.macId = macId
  50.  
  51. db.create_all()

  user表和phone表的一对多的关系通过下面语句确定:

  1. phone = db.relationship('Phone', backref='user', lazy='dynamic')

  其中rrealtionship描述了user和phone的关系。在此文中,第一个参数为对应参照的类"Phone";

第二个参数backref为类Phone申明新属性的方法;第三个参数lazy决定了什么时候SQLALchemy从

数据库中加载数据。

2. 构造api获取数据资源

  注意:在获取资源之前,先向数据库中写入测试数据

  1. #!usr/bin/env pyhton
  2. # -*- coding: utf-8 -*-
  3.  
  4. from flask import Flask
  5. from flask.ext.restful import reqparse, Api, Resource
  6. from model import *
  7.  
  8. app = Flask(__name__)
  9. api = Api(app)
  10.  
  11. def to_json(model):
  12. """ Returns a JSON representation of an SQLAlchemy-backed object. """
  13. json = {}
  14. # json['fields'] = {}
  15. # json['pk'] = getattr(model, 'id')
  16. for col in model._sa_class_manager.mapper.mapped_table.columns:
  17. # json['fields'][col.name] = getattr(model, col.name)
  18. json[col.name] = getattr(model, col.name)
  19. # return dumps([json])
  20. return json
  21.  
  22. def to_json_list(model_list):
  23. json_list = []
  24. for model in model_list:
  25. json_list.append(to_json(model))
  26. return json_list
  27.  
  28. def message(record):
  29. if record:
  30. return to_json(record), 200
  31. return {"message": "not exit"}, 400
  32.  
  33. class userResource(Resource):
  34.  
  35. def get(self, id):
  36. record = Usr.query.filter_by(id=id).first()
  37. return to_json_list(record.phone.first().phone)
  38.  
  39. def put(self, id):
  40. parser = reqparse.RequestParser()
  41. parser.add_argument('username', type=str)
  42. args = parser.parse_args(strict=True)
  43. record = Usr.query.filter_by(id=id).first()
  44. if record:
  45. record.username = args['username']
  46. db.session.commit()
  47. return {"status": "updated"}, 201
  48. return {"message": "not exit"}, 400
  49.  
  50. def delete(self, id):
  51. record = Usr.query.filter_by(id=id).first()
  52. if record:
  53. db.session.delete(record)
  54. db.session.commit()
  55. return {"status": "deleted"}, 204
  56. return {"message": "not exit"}, 400

  class AtrrResource(Resource):

    def get(self, id):
    record = Atttr.query.filter_by(id=id).first()
    return message(record.phone.user)

api.add_resource(userResource, '/v1.0/user/<id>')
  api.add_resource(usrList, '/v1.0/user', '/v1.0/user/')

api.add_resource(AtrrResource, '/v1.0/atrr/<id>')

 if '__name__' == '__main__' :

   app.run(DEBUG=True)

通过在浏览器中输入url: 127.0.0.1:5000/v1.0/user/1可以获得某用户的某种类型手机的所有属性。

主要为get函数,其通过三层访问,即可得到相关的信息。当然还可以通过查询某一手机的颜色获取其

用户的信息,如Atttr get所示。

参考资料:

[1] http://docs.jinkan.org/docs/flask-sqlalchemy/models.html#id3

flask SQLAlchemy中一对多的关系实现的更多相关文章

  1. python3 + flask + sqlalchemy +orm(3):多对多关系

    一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...

  2. EF中一对多的关系中,用单字段保存ID拼接字符串

    model.SubjectTerms = model.SelectedSubjectTerm.Trim(',').Split(',').ToList().Select(x => new Subj ...

  3. jeecg中一对多的关系映射

    1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPositi ...

  4. 用SQLAlchemy创建一对多,多对多关系表

    多对多关系表的创建: 如果建立好多对多关系后,我们就可以通过关系名进行循环查找,比如laowang = Teacher.query.filter(Teacher.name=='laowang').fi ...

  5. SQLALchemy中关于复杂关系表模型的映射处理

    映射在第五步,我们还是一步一步来哈 一. 关系介绍 举一个比较经典的关系,部门与员工(以下是我的需求情况,算是把该有的关系都涉及到了) 1.每个部门会有很多成员(这里排除一个成员属于多个部门的情况) ...

  6. java类集开发中一对多和多对多的关系的实现

    摘自<java开发实战经典>李兴华.著 一对多的关系 一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,此时就可以通过类集进行关系的表示. 在定义Studen ...

  7. python3 + flask + sqlalchemy +orm(2):数据库中添加表

    往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...

  8. 12.翻译系列:EF 6 中配置一对多的关系【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-f ...

  9. day95:flask:SQLAlchemy数据库查询进阶&关联查询

    目录 1.数据库查询-进阶 1.常用的SQLAlchemy查询过滤器 2.常用的SQLAlchemy查询结果的方法 3.filter 4.order_by 5.count 6.limit&of ...

随机推荐

  1. centos7安装redis

    方法一:使用命令安装(前提是已经安装了EPEL). 安装redis: yum -y install redis 启动/停止/重启 Redis 启动服务: 1 systemctl start redis ...

  2. 20155229-付钰涵-分析自我技能延展到c语言学习状况

    我的小技能 我记得幼儿园时表演的舞蹈,也记得从水彩到素描的学习,还记得小学和初中获得的钢琴省级奖项. 舞蹈止于一年级,绘画止于三年级,钢琴从学前班到高一那十年的时间里有过断续. 03年-04年的那个冬 ...

  3. HTML5新增标签

    section标签  <section>标签,定义文档中的节.比如章节.页眉.页脚或文档中的其它部分.一般用于成节的内容,会在文档流中开始一个新的节.它用来表现普通的文档内容或应用区块,通 ...

  4. poj 1328 Radar Installation

    题目链接:http://poj.org/problem?id=1328 题意:给出海上有n个小岛的坐标,求发出的信号可以覆盖全部小岛的最少的雷达个数.雷达发射信号是以雷达为圆心,d为半径的圆,雷达都在 ...

  5. BADI_MATERIAL_CHECK(物料主数据表的增强检查)

    多次调用的BADI,'业务加载项定义的多重使用意味着可以有多个活动的 业务加载项实施.在进行调用时,将调用所有上述实施,但调用顺序不可预期. 因此,如果使用多重使用 业务加载项定义,那么顺序不得起到任 ...

  6. css中的一些属性解析

    1.inline-block 存在问题:inline-block的相互间距,元素之间会有一个左右2px的margin一样产生            请看中间的空隙. 为什么会产生这个空隙呢?? 怎么解 ...

  7. java selenium (十一) 操作弹出对话框

    Web 开发人员通常需要利用JavaScript弹出对话框来给用户一些信息提示, 包括以下几种类型 阅读目录 对话框类型 1.  警告框: 用于提示用户相关信息的验证结果, 错误或警告等 2. 提示框 ...

  8. 使用VC6.0创建和运行C程序的方法

    使用VC6.0可以有快捷的方式创建C程序,对于初学者,建议按照如下方式创建.先创建一个工作区,然后创建工程,最后在工程中创建源文件文件.理解工作区.工程与文件之间的关系.

  9. 【 2013 Multi-University Training Contest 8 】

    HDU 4678 Mine 对于每个空白区域,求SG值. 最后异或起来等于0,先手必败. #pragma comment(linker,"/STACK:102400000,102400000 ...

  10. Android中View的事件分发机制

    简介 事件也称MotionEvent,事件分发机制就是对MotionEvent事件的分发过程,即当一个MotionEvent发生之后,系统需要把这个事件传递给一个具体的View. 点击事件的分发过程由 ...