Flask-SQLAlchemy(二) 一对多关系

一对多关系

下面的一对多关系以作者和文章为例:

首先创建一个文章表:

class Post(db.Model):
  id = db.Column(db.Integer(),primary_key=True)
    title = db.Column(db.String(255))
  text = db.Column(db.Text())
  publish_date = db.Column(db.DateTime())
  user_id = db.Column(db.Integer(),db.ForeignKey('user.id'))

此处注意:

  1. 传给db.ForeignKey的参数,是一个用来代表user表id列的字符串,如果user表中用__tablename__自定义表名,则需要用自定义的表名
  2. “多”的一方写ForeignKey,可以通过表名.(“一”的一方的backref)对“一”的一方进行读取和修改。relationship可以在任意一方,一般是在“一”的一方。

下面创建作者表:

class User(db.Model):
  id = db.Column(db.Integer(),primary_key=True)
  username = db.Column(db.String(255))
  password = db.Column(db.String(255))
  posts = db.relationship('Post',backref='user',lazy='dynamic')

可以发现一对多关系的创建和上文总结的一对一关系只有一个区别:
把uselist = False,替换为了lazy = 'dynamic’


lazy关键字的作用

官方解释:lazy 决定了 SQLAlchemy 什么时候从数据库中加载数据
查阅资料发现lazy其实有五个可选参数,分别是“dynamic”,“select”, “joined”,“subquery"和不常用的"noload”, 一般只用前三个,默认值为“select”。

registrations = db.Table('registrations',
                         db.Column('student_id', db.Integer, db.ForeignKey('students.id')),
                         db.Column('class_id', db.Integer, db.ForeignKey('classes.id')))

class Student(db.Model):
    __tablename__ = 'students'
    
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))
    
    def __repr__(self):
        return '<Student: %r>' %self.name

class Class(db.Model):
    __tablename__ = 'classes'
    
    id = db.Column(db.Integer, primary_key=True)
    students = db.relationship('Student', backref='_class', lazy="dynamic")
    name = db.Column(db.String(64))
    
    def __repr__(self):
        return '<Class: %r>' %self.name

示例
在这里插入图片描述
在这里插入图片描述
可以看到, 执行c1.student返回的是是一个 query对象,而select或者是joined都会直接返回结果,在数据量较大时不适用。而多对一和一对一的关系中不使用lazy = ‘dynamic’,因为返回结果只有一个,没有必要延迟加载数据。

当然,也可以给多对多关系中反向引用backref中添加lazy属性

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

即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫兮如风i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值