Flask中一对多,一对一,多对多模型

1、一个非常简单的例子

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

2、一对多关系

# 一
class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',lazy='dynamic')

# 多
class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
addresses = db.relationship('Address', backref='person',lazy='dynamic')

       relationship函数:sqlalchemy对关系之间提供的一种便利的调用方式,关联不同的表;

       backref参数:对关系提供反向引用的声明,在Address类上声明新属性的简单方法,之后可以在my_address.person来获取这个地址的person;

       lazy参数:决定了 SQLAlchemy 什么时候从数据库中加载数据,有四个可选方式:'select','joined','subquery','dynamic':

  • 'select'(默认值):SQLAlchemy 会在使用一个标准 select 语句时一次性加载数据;
  • 'joined':让 SQLAlchemy 当父级使用 JOIN 语句是,在相同的查询中加载关系;
  • 'subquery':类似 'joined' ,但是 SQLAlchemy 会使用子查询;
  • 'dynamic':SQLAlchemy 会返回一个查询对象,在加载这些条目时才进行加载数据,大批量数据查询处理时推荐使用。
person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

       ForeignKey参数:代表一种关联字段,将两张表进行关联的方式,表示一个person的外键,设定上必须要能在父表中找到对应的id值。

3、一对一关系

class Parent(Base):
    id = Column(Integer, primary_key=True)
    child_id = Column(Integer, ForeignKey('child.id'))
    child = relationship("Child", backref=backref("parent", uselist=False)) 

class Child(Base):
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

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

4、多对多关系

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tags = db.relationship('Tag', secondary=tags, backref=db.backref('pages', lazy='dynamic'))

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)

如果想要用多对多关系,需要在两个类之间增加一个关联的辅助表。

tags = db.relationship('Tag', secondary=tags, backref=db.backref('pages', lazy='dynamic'))

secondary参数:指定多对多关系中关系表的名字;

backref函数:由于在这里我们需要在每一页显示多个标签,所以使用backref参数添加一个反向引用,配置 Page.tags 加载后作为标签的列表。

 

转载于:https://www.cnblogs.com/notzy/p/9187232.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值