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

相關文章
相關標籤/搜索