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: [email protected]/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从

数据库中加载数据。

#!/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: [email protected]/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()

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

时间: 2025-01-06 01:59:31

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

jeecg中一对多的关系映射

1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPosition="top" fit="false"> <t:tab href="erpController.do?erpList&id=${erpPage.id}&tag=${tag}" icon="icon-search

hibernate中一对多关系模式的设计

hibernate中一对多的关系模式的设计 注解应该交由多的一方维护和管理. 例如:bbs的模块设计 三个表 版块表(category) .主题帖表(topic)和回帖表(msg) 他们之间的对应关系是:一个版块对应多个主题帖,一个主题帖有多个回复贴. 以下是对应的建表语句. CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (

flask框架中SQLAlchemy相关

SQLAlchemy常用字段类型对照 类型名 python中类型 说明 Integer int 普通整数,一般是32位 SmallInteger int 取值范围小的整数,一般是16位 BigInteger int或long 不限制精度的整数 Float float 浮点数 Numeric decimal.Decimal 普通整数,一般是32位 String str 变长字符串 Text str 变长字符串,对较长或不限长度的字符串做了优化 Unicode unicode 变长Unicode字符

Flask SQLAlchemy &amp; model

Flask-SQLAlchemy Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命令. 配置Flask-SQLAlchemy 示例: MySQL: mysql://username:[email protected]/database 定义模型 from sqlalchemy import Column, Integer, MetaData, VARCHAR from flask

一对多的关系

<resultMap type="Person" id="personBean"> <id column="personId" property="id"/> <result column="personName" property="name"/> <result column="personAddress" propert

Mybatis 中一对多,多对一的配置

现在有很多电商平台,就拿这个来说吧.顾客跟订单的关系,一个顾客可以有多张订单,但是一个订单只能对应一个顾客. 一对多的顾客 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd&quo

浅谈JavaEE中的Hibernate中的四种关系映射(三)

今天我们一起来探讨一下有关Hibernate四种关系映射,大家可能会有疑惑,关系映射不就是只有三种(一对一,一对多,多对多)吗?这里我们再多说一个继承映射关系,虽然它使用频繁度没有前三个那么多,但是它在一些特定情况下,还是非常有用的,至于有什么用下面马上就要讲.这些关系映射实际上就是对应着关系型数据库中的几种关系的类型.我们都知道Hibernate的作用是将面向关系数据操作,转换成面向对象的操作,其中关系映射文件就是实现这个转换的核心.我们都知道如果我们仅仅使用SQL语句建表并且去维护表与表之间

java框架篇---hibernate(一对多)映射关系

一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多的关系.如果想对母亲信息的操作同时也反应在其孩子信息上那么可以在母亲类配置文件的集合属性上配置cascade="all",表示对关联实体进行级联更新配置. “主”端: 多的一端 <?xml version="1.0"?> <!DOCTYPE hiber

Hibernate中一对多关联的时候hbm.xml文件的配置

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon