Flask框架從入門到精通之模型關係(十七)

〆 小源。發表於2019-05-04

知識點: 1、模型關係參照

一、概況

在資料庫中,我們知道資料關係大概有如下幾種:一對一、一對多、多對多、自關聯等。我們模型已經描述過了一對多,那麼下面我們在用模型把其它關係也寫出來。

關係

  • 一對一模型 案例:一篇文章只對應一個內容

# 文章模型
class Article(db.Model):
    # 表名
    __tablename__ = 'tbl_article'

    # 資料庫真正存在的欄位
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    title = db.Column(db.String(128), unique=True)  # 名字
    
    # 方便查詢,資料並不存在的欄位
    content = db.relationship('Acontent', backref='article', uselist=False) #一對一需要把uselist設定為False


# 內容模型
class Acontent(db.Model):
    # 表名
    __tablename__ = 'tbl_acontent'

    # 資料庫真正存在的欄位
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    content = db.Column(db.Text(4000))  # 名字
    article_id = db.Column(db.Integer, db.ForeignKey('tbl_article.id'))
複製程式碼
tbl_article
id title
1 Flask入門
2 Flask模型
tbl_acontent
id content article_id
1 Flask是輕量級框架 1
2 Flask是模型入門 2
  • 一對多模型 案例:一個分類下有很多文章
# 分類模型
class Category(db.Model):
    # 表名
    __tablename__ = 'tbl_category'

    # 資料庫真正存在的欄位
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    name = db.Column(db.String(32), unique=True)  # 名字
    # 方便查詢,資料並不存在的欄位
    article = db.relationship('Article', backref='category')


# 文章模型
class Article(db.Model):
    # 表名
    __tablename__ = 'tbl_article'

    # 資料庫真正存在的欄位
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    title = db.Column(db.String(128), unique=True)  # 名字
    category_id = db.Column(db.Integer, db.ForeignKey('tbl_category.id'))  # 分類id
    # 方便查詢,資料並不存在的欄位
    content = db.relationship('Acontent', backref='article', uselist=False)  # 一對一需要把uselist設定為False
複製程式碼
tbl_category
id name
1 框架
2 模型
tbl_article
id title category_id
1 Flask是輕量級框架 1
2 Flask是模型入門 2
3 Flask是模型查詢 2
  • 多對多模型 案例:一個標籤對應很多文章,一篇文章也對應很多標籤
# 輔助表
tbl_tags = db.Table('tbl_tags',
                db.Column('tag_id', db.Integer, db.ForeignKey('tbl_tag.id')),
                db.Column('article_id', db.Integer, db.ForeignKey('tbl_article.id'))
                )

# 標籤模型
class Tag(db.Model):
    # 表名
    __tablename__ = 'tbl_tag'

    # 資料庫真正存在的欄位
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    name = db.Column(db.String(32), unique=True)  # 名字


# 文章模型
class Article(db.Model):
    # 表名
    __tablename__ = 'tbl_article'

    # 資料庫真正存在的欄位
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    title = db.Column(db.String(128), unique=True)  # 名字
    category_id = db.Column(db.Integer, db.ForeignKey('tbl_category.id'))  # 分類id
    # 方便查詢,資料並不存在的欄位
    content = db.relationship('Acontent', backref='article', uselist=False)  # 一對一需要把uselist設定為False
    tags = db.relationship('Tag', secondary=tbl_tags, backref='articles')
複製程式碼
tbl_tag
id name
1 python
2 後端
3 mysql
tbl_article
id title category_id
1 Flask是輕量級框架 1
2 Flask是模型入門 2
3 Flask是模型查詢 2
tbl_tags
tag_id article_id
1 1
1 1
2 1
2 2
  • 自關聯模型 案例:地區
# 地區模型
class Area(db.Model):
    # 表名
    __tablename__ = "tbl_area"
    # 資料庫真正存在的欄位
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    name = db.Column(db.Text, nullable=False)  # 地區名字
    parent_id = db.Column(db.Integer, db.ForeignKey("tbl_area.id"))  # 父評論id

    # 方便查詢,資料並不存在的欄位
    parent = db.relationship("Area", remote_side=[id])  # 自關聯需要加remote_side

複製程式碼
id name parent_id
1 北京市 Null
2 黑龍江 Null
3 哈爾濱 2
4 南崗區 3
5 北京市 1
6 朝陽區 5

歡迎關注我的公眾號:

image

相關文章