flask中常见的关系模型定义

flask中常见的关系模型定义
一对多
应用场景:角色与所属于该角色的用户(角色表与多用户表)

[Python] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

class Role(db.Model):

    __tablename__ = ‘roles‘

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True)

    users = db.relationship(‘User‘, backref=‘role‘, lazy=‘dynamic‘)

class User(db.Model):

    __tablename__ = ‘users‘

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True, index=True)

relationship函数:sqlalchemy对关系之间提供的一种便利的调用方式,关联不同的表
backref:在关系的另一模型中添加反向引用
lazy参数:决定了 SQLAlchemy 什么时候从数据库中加载数据,有四个可选方式:‘select‘,‘joined‘,‘subquery‘,‘dynamic‘:
‘select‘(默认值):SQLAlchemy 会在使用一个标准 select 语句时一次性加载数据;
‘joined‘:让 SQLAlchemy 当父级使用 JOIN 语句是,在相同的查询中加载关系;
‘subquery‘:类似 ‘joined‘ ,但是 SQLAlchemy 会使用子查询;
‘dynamic‘:SQLAlchemy 会返回一个查询对象,在加载这些条目时才进行加载数据,大批量数据查询处理时推荐使用。

一对一
应用场景:用户与该用户对应的地址信息

[Python] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

class User(db.Model):

    __tablename__ = ‘users‘

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True, index=True)

    address= relationship("Address", backref=backref("user", uselist=False))

class Address(db.Model):

    __tablename__ = ‘users‘

    id = db.Column(db.Integer, primary_key=True)

    name= db.Column(db.String(64))

在一对多关系基础上的用户表中使用backref函数,并添加uselist参数来表示一对一关系。

多对多
应用场景:学生与其选修的课程(学生表与选修课程表)

[Python] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

tb_student_course = db.Table(‘tb_student_course‘,

                             db.Column(‘student_id‘, db.Integer, db.ForeignKey(‘students.id‘)),

                             db.Column(‘course_id‘, db.Integer, db.ForeignKey(‘courses.id‘))

                             )

class Student(db.Model):

    __tablename__ = "students"

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True)

    courses = db.relationship(‘Course‘, secondary=tb_student_course,

                              backref=db.backref(‘students‘, lazy=‘dynamic‘),

                              lazy=‘dynamic‘)

class Course(db.Model):

    __tablename__ = "courses"

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True)

secondary:指定多对多关系中关系表的名字
backref:在关系的另一模型中添加反向引用,并且决定反向查询时什么时候从数据库中加载数据

自关联一对多
应用场景:评论与该评论的子评论(评论表)

[Python] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

class Comment(db.Model):

    __tablename__ = "comments"

    id = db.Column(db.Integer, primary_key=True)

    # 评论内容

    content = db.Column(db.Text, nullable=False)

    # 父评论id

    parent_id = db.Column(db.Integer, db.ForeignKey("comments.id"))

    # 父评论(也是评论模型)

    parent = db.relationship("Comment", remote_side=[id],

                             backref=db.backref(‘childs‘, lazy=‘dynamic‘))

remote_side:指定自关联的关系字段,为当前表主键

自关联多对多
应用场景:用户关注其他用户(用户表,中间表)

[Python] 纯文本查看 复制代码

?


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

tb_user_follows = db.Table(

    "tb_user_follows",

    db.Column(‘follower_id‘, db.Integer, db.ForeignKey(‘info_user.id‘), primary_key=True),  # 粉丝id

    db.Column(‘followed_id‘, db.Integer, db.ForeignKey(‘info_user.id‘), primary_key=True# 被关注人的id

)

class User(db.Model):

    __tablename__ = "info_user"

    id = db.Column(db.Integer, primary_key=True

    name = db.Column(db.String(32), unique=True, nullable=False)

    # 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人

    followers = db.relationship(‘User‘,

                                secondary=tb_user_follows,

                                primaryjoin=id == tb_user_follows.c.followed_id,

                                secondaryjoin=id == tb_user_follows.c.follower_id,

                                backref=db.backref(‘followed‘, lazy=‘dynamic‘),

                                lazy=‘dynamic‘)

primaryjoin:明确指定两个模型之间使用的关系条件
secondaryjoin:在SQLAlchemy中无法自行决定时,指定多对多关系中的二级关系条件

更多技术资讯可关注:gzitcast

原文地址:https://www.cnblogs.com/heimaguangzhou/p/11696383.html

时间: 2024-10-09 11:14:53

flask中常见的关系模型定义的相关文章

Flask框架之一对多关系模型定义

案例代码: #定义模型 class BookInfo(db.Model): #设置表名 __tablename__ = 'bookinfo' #设置为主键之后,自动自增长 id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(20),unique=True,nullable=False) pub_date = db.Column(db.Date,nullable=True) readcount = db.Co

面向对象中常见的关系理解

面向对象有几种关系 泛化和实现 关联和依赖 关系理解 泛化:就是继承                        实线带三角形 实现:就是实现接口                虚线带三角型 关联:分为三种,单向关联,双向关联和自身关联.实线 双向关联:这意味着,两个类彼此知道它们间的关系.从代码级别上看,就是A类里存在对B类的属性应用,B类里也存在着对A类的应用 单向关联:在一个单向关联当中,两个类是相关的,但是只有一个类知道这种联系的存在.从代码级别上看,就是A类对象对B类对象的属性应用,

Flask框架之多对多关系模型类的定义

案例代码: table_relation = db.Table('stu_tea_rel', # 关系表明 db.Column('stu_id', db.Integer, db.ForeignKey('student.id')), # 多关系表的主键 db.Column('tea_id', db.Integer, db.ForeignKey('teacher.id'))) # 多关系表的主键 class Student(db.Model): id = db.Column(db.Integer,

UML中常见关系详解(泛化、实现、依赖、关联、组合、聚合)

UML中类与类,已经类与接口,接口与接口的关系有:泛化(generalization),关联(association),依赖(dependency),实现(realization)这几种. 泛化(generalization)关系时指一个类(子类.子接口)继承另外一个类(称为父类.父接口)的功能,并可以增加它自己新功能的能力,继承是类与类或者接口与接口最常见的关系,在Java中通过关键字extends来表示. 实现(realization)是指一个class实现interface接口(一个或者多

浏览器中常见网络协议介绍

本周五我在公司有一个关于<HTTP 协议>的培训,只有两个小时,估计能讲到的东西不会太多.实际上,浏览器为了完成 WEB 应用的各项功能,需要跟各种网络协议打交道,HTTP 只是其中一种.本文会介绍浏览器中常见的网络协议,以及各种协议之间的关系. 我们经常会听到「TCP/IP 协议」这个名词,从字面上看,有人会认为它专指 TCP 和 IP 两种协议.实际上大多数情况,TCP/IP 协议指的是整个网际协议族(Internet Protocol Suite),是利用 IP 协议进行通讯的其他协议统

flask 中的ORM

1 响应(response) 1 什么是响应 响应就是由服务器端带给客户端的内容,对应着请求,响应可以是普通的字符串,模板 或重定向 return '普通字符串' return render_template('xxx.html') 2 响应对象 响应对象:将响应的内容封装到一个对象中,可以完成更多的响应的行为(如:增加cookies,..) 在Flask中,使用 make_response() 构建响应对象 2 文件上传 1 注意问题 表单中如果有文件上传的话,必须遵循以下两个要求 1 提交方

在flask中使用SQLAlchemy连接sqllite数据库

设置数据库路径非常重要: 方法: 1 配置数据库 basedir= os.path.abspath(os.path.dirname(__file__)) #获取当前文件的绝对路径 app = Flask(__name__) # 拼接数据库的URL路径 # os.path.join 把basedir和data.sqlite的路径拼接起来# # data.sqlite为数据库文件,若该文件夹下没有这个文件会自动创建 app.config['SQLALCHEMY_DATABASE_URI'] = 's

Python实现RabbitMQ中6种消息模型

RabbitMQ与Redis对比 ? RabbitMQ是一种比较流行的消息中间件,之前我一直使用redis作为消息中间件,但是生产环境比较推荐RabbitMQ来替代Redis,所以我去查询了一些RabbitMQ的资料.相比于Redis,RabbitMQ优点很多,比如: 具有消息消费确认机制 队列,消息,都可以选择是否持久化,粒度更小.更灵活. 可以实现负载均衡 RabbitMQ应用场景 异步处理:比如用户注册时的确认邮件.短信等交由rabbitMQ进行异步处理 应用解耦:比如收发消息双方可以使用

(2)java中的集中关系,is a, has a, 继承,重点聊聊继承

java中常见的类关系(javacore上面也有介绍道的) 1.is a关系() 2.has a 整体与局部的关系 3.继承关系 是现实世界中存在而上面两种关系又无法描述的 当然谈的最多的是继承关系,这就出现了,父类和子类.父子类之间有下面一些故事. 父子类中的一般注意事项 子类显示调用父类的构造函数 使用关键字super(), 必须放到子类构造函数的第一行,否则会报错. super和this的区别 super主要是在子类中使用,调用父类的构造方法super(),调用父类的属性方法super.x