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中一对多的关系实现的更多相关文章

  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. 十天精通CSS3学习笔记 part2

    第6章 征服CSS3选择器(上) 属性选择器 在HTML中,通过各种各样的属性可以给元素增加很多附加的信息.例如,通过id属性可以将不同div元素进行区分. 在CSS2中引入了一些属性选择器,而CSS ...

  2. 用margin还是padding

    用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时 ...

  3. 获取Mac地址

    netapi32.lib#include <NB30.h>; typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER Name ...

  4. Sample a balance dataset from imbalance dataset and save it(从不平衡数据中抽取平衡数据,并保存)

    有时我们在实际分类数据挖掘中经常会遇到,类别样本很不均衡,直接使用这种不均衡数据会影响一些模型的分类效果,如logistic regression,SVM等,一种解决办法就是对数据进行均衡采样,这里就 ...

  5. FlexBox标准及兼容写法速查表

    FlexBox标准写法: 支持浏览器: IE11,  Chrome29+, FireFox 20+, Safari加前缀 -webkit- 概述: 总的来说就是12个属性; 关于容器的6个,5个单一属 ...

  6. 关于javascript闭包中的this对象

    我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...

  7. 在CentOS 6.7中安装 latex2html, 实现 latex 自动转化为 word

    由于latex文档生成的pdf不便于提供审阅和修改,亟需一个软件实现从latex向word文档的自动转换( 如何把Latex自动转为Word 介绍了由latex2html 可实现这个功能,这也是初衷) ...

  8. oracle 存储过程小总结

    1 创造存储过程 Create or procedure My_procedure( param1,param2) is Begin . . . End 2 判断语句 If x>0 then B ...

  9. Bootstrap学习应用

    1.栅格式布局:     栅格只有12格  主要用于没有设计经验,自行设计网页. 起步:     导入一个CSS文件 和两个JS文件  BOOTATRAP.MIN.CSS  ---   /*IE(ht ...

  10. Android按钮的各个样式设置

    安卓开发学习之014 Button应用详解(样式.背景.按钮单击.长按.双击.多击事件) 一.Button简介 按钮也是继承自TextView 二.XML定义方法 <Button android ...