flask SQLAlchemy中一对多的关系实现
SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系,
其中一对多是一种比较常见的关系。利用flask sqlalchemy实现一对多的关系如下:
1. 建立数据库的模型
在本次试验中建立三个表: user, phone ,atttr。user 和phone, phone 和atttr均为一对多的关系。实现如下:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- from flask import Flask
- from flask.ext.sqlalchemy import SQLAlchemy
- app = Flask(__name__)
- # 配置数据库
- app.config[
- 'SQLALCHEMY_DATABASE_URI'] = \
- "mysql://root: root@127.0.0.1/test?charset=utf8"
- db = SQLAlchemy(app)
- # 建立user表
- class Usr(db.Model):
- __tablename__ = 'usr'
- id = db.Column(db.Integer, primary_key=True)
- usrname = db.Column(db.String(80), unique=True)
- email = db.Column(db.String(120), unique=True)
- phone = db.relationship('Phone', backref='user', lazy='dynamic')
- def __init__(self, username, email):
- self.usrname = username
- self.email = email
- class Phone(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(20))
- factory = db.Column(db.String(20))
- userId = db.Column(db.Integer, db.ForeignKey('usr.id'))
- attr = db.relationship(
- 'Atttr', backref='phone', lazy='dynamic')
- def __init__(self, name, factory, userId):
- self.name = name
- self.factory = factory
- self.userId = userId
- class Atttr(db.Model):
- id = db .Column(db.Integer, primary_key=True)
- color = db.Column(db.String(20))
- price = db.Column(db.String(20))
- macId = db.Column(db.Integer, db.ForeignKey('phone.id'))
- def __init__(self, color, price, macId):
- self.color = color
- self.price = price
- self.macId = macId
- db.create_all()
user表和phone表的一对多的关系通过下面语句确定:
- phone = db.relationship('Phone', backref='user', lazy='dynamic')
其中rrealtionship描述了user和phone的关系。在此文中,第一个参数为对应参照的类"Phone";
第二个参数backref为类Phone申明新属性的方法;第三个参数lazy决定了什么时候SQLALchemy从
数据库中加载数据。
2. 构造api获取数据资源
注意:在获取资源之前,先向数据库中写入测试数据
- #!usr/bin/env pyhton
- # -*- coding: utf-8 -*-
- from flask import Flask
- from flask.ext.restful import reqparse, Api, Resource
- from model import *
- app = Flask(__name__)
- api = Api(app)
- def to_json(model):
- """ Returns a JSON representation of an SQLAlchemy-backed object. """
- json = {}
- # json['fields'] = {}
- # json['pk'] = getattr(model, 'id')
- for col in model._sa_class_manager.mapper.mapped_table.columns:
- # json['fields'][col.name] = getattr(model, col.name)
- json[col.name] = getattr(model, col.name)
- # return dumps([json])
- return json
- def to_json_list(model_list):
- json_list = []
- for model in model_list:
- json_list.append(to_json(model))
- return json_list
- def message(record):
- if record:
- return to_json(record), 200
- return {"message": "not exit"}, 400
- class userResource(Resource):
- def get(self, id):
- record = Usr.query.filter_by(id=id).first()
- return to_json_list(record.phone.first().phone)
- def put(self, id):
- parser = reqparse.RequestParser()
- parser.add_argument('username', type=str)
- args = parser.parse_args(strict=True)
- record = Usr.query.filter_by(id=id).first()
- if record:
- record.username = args['username']
- db.session.commit()
- return {"status": "updated"}, 201
- return {"message": "not exit"}, 400
- def delete(self, id):
- record = Usr.query.filter_by(id=id).first()
- if record:
- db.session.delete(record)
- db.session.commit()
- return {"status": "deleted"}, 204
- 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中一对多的关系实现的更多相关文章
- python3 + flask + sqlalchemy +orm(3):多对多关系
一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...
- EF中一对多的关系中,用单字段保存ID拼接字符串
model.SubjectTerms = model.SelectedSubjectTerm.Trim(',').Split(',').ToList().Select(x => new Subj ...
- jeecg中一对多的关系映射
1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPositi ...
- 用SQLAlchemy创建一对多,多对多关系表
多对多关系表的创建: 如果建立好多对多关系后,我们就可以通过关系名进行循环查找,比如laowang = Teacher.query.filter(Teacher.name=='laowang').fi ...
- SQLALchemy中关于复杂关系表模型的映射处理
映射在第五步,我们还是一步一步来哈 一. 关系介绍 举一个比较经典的关系,部门与员工(以下是我的需求情况,算是把该有的关系都涉及到了) 1.每个部门会有很多成员(这里排除一个成员属于多个部门的情况) ...
- java类集开发中一对多和多对多的关系的实现
摘自<java开发实战经典>李兴华.著 一对多的关系 一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,此时就可以通过类集进行关系的表示. 在定义Studen ...
- python3 + flask + sqlalchemy +orm(2):数据库中添加表
往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...
- 12.翻译系列:EF 6 中配置一对多的关系【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-f ...
- day95:flask:SQLAlchemy数据库查询进阶&关联查询
目录 1.数据库查询-进阶 1.常用的SQLAlchemy查询过滤器 2.常用的SQLAlchemy查询结果的方法 3.filter 4.order_by 5.count 6.limit&of ...
随机推荐
- CentOS7 安装MongoDB 3.0服务器
1,下载&安装 MongoDB 3.0 正式版本发布!这标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大.灵活而且易于管理的数据库管理系统.MongoDB宣称,3.0新版本不只 ...
- css学习笔记 3
css选择符: 通配选择符:* 类选择符:.className 标签选择符 后代选择符:例:p strong ,选择的是p标签内的所有strong标签. 子选择符:> ,只选择父标签内的直接子标 ...
- 解决eclipse之ADT与SDK版本不一致问题
This Android SDK requires Android Developer Toolkit version … .Please update ADT to the latest versi ...
- postgres 正则表达式 转
http://blog.csdn.net/wugewuge/article/details/7704996 postgresql中使用正则表达式时需要使用关键字“~”,以表示该关键字之前的内容需匹配之 ...
- vue-新建项目出错情况分析
1.状况一: 按照正常流程新建项目,最终运行npm run dev 的时候,就频频出错,最终找出问题原来在于部分依赖包丢失了,于是重新安装所需要的依赖包再运行项目便好了!
- java sqlhelper
dbinfo.properties部分: 注意每行末尾不可以有空格 #oracle configure UserName=scott Password=tiger Driver=oracle.jdbc ...
- jquery中链式调用原理
(1).链式调用 $("#mybtn").css("width","100px") .css("height",&quo ...
- 国内技术管理人员批阅google的“春运交通图”项目(大公司下的高效率)<转载>
在整理一份报告的时候,偶然看到2008年春节期间google推出的“春运交通图”项目建设历程报道,很受启发,随以国内的技术管理人员眼光批阅了这篇文章,同时也是自嘲吧. 以下黑色字体是原报道,红色字体是 ...
- linux 系统负载高 如何检查
1:load Average 1.1:什么是Load?什么是Load Average? Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a mea ...
- Bootstrap <基础七>按钮
任何带有 class .btn 的元素都会继承圆角灰色按钮的默认外观.但是 Bootstrap 提供了一些选项来定义按钮的样式,具体如下表所示: 以下样式可用于<a>, <butto ...