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

一、一个很是简单的例子

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

二、一对多关系

# 一
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对关系之间提供的一种便利的调用方式,关联不一样的表;html

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

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

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

person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

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

三、一对一关系

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参数来表示一对一关系。sql

四、多对多关系

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参数:指定多对多关系中关系表的名字;canvas

backref函数:因为在这里咱们须要在每一页显示多个标签,因此使用backref参数添加一个反向引用,配置 Page.tags 加载后做为标签的列表。ruby

相关文章
相关标签/搜索