实体模型中相关的模型之间为了方便查询需要做到你中有我 我中有你
多对多与一对多实体模型的区别
一对多
- 表设计上是在多方应用少方的主键作为外键约束
- 模型上需要在多方加入一个少方模型对象的属性,在少方加入一个多方对象的列表
- 语法:少方对象=db.relationship(‘少方模型名’,backref=db.backref(‘xxlist’))
多对多
- 表设计上需要建立一个关系表 甲乙双方的主键进行关系映射
- 模型上需要在甲方添加一个乙方模型对象的列表,在乙方添加一个甲方模型对象的列表
- 语法:乙方对象列表名 =db.relationship(‘乙方模型名’,secondary=’数据库关系表名’,backref=db.backref(‘甲方模型对象列表名’))
- 关系表的模型用db.Table()来创建,而不是定义一个关联表实体类
-------关系表模型----------
article_tag = db.Table('article_tag',
db.Column('article_id', db.Integer, db.ForeignKey('article.id'), primary_key=True),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True)
)
--多对多模型--
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
---关联关系---
tags = db.relationship('Tag',secondary='article_tag',backref=db.backref('articles'))
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
tagname = db.Column(db.String(100), nullable=False)
------查询案例---------
article1 = Article.query.filter(Article.title=='aaa').first()
for x in article1.tags:
print(x.tagname)