使用多对多关系,首先需要定义一个用于关系的辅助表。对于这个辅助表, 强烈建议不使用模型,而是采用一个实际的表。这里使用了 User
和 Tag
之间的多对多关系,一个联系人可以有多个标签,一个标签下也可以有多个联系人。关系辅助表一定要在模型表之前定义,不然创建表的时候容易报错。先定义关系辅助表:
#关系表要放到表的前边建立
tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
db.Column('user_id', db.Integer,
db.ForeignKey('user.id'))
定义Model类 :
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
# 建立多对多关系
tags = db.relationship('Tag', secondary=tags, back_populates='users')
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
# 建立多对多关系
users = db.relationship(
'User', secondary=tags, back_populates='tags')
编写代码测试:
@app.cli.command()
def test_mtom():
art1 = User(name='张三')
art2 = User(name='李四')
art3 = User(name='王五')
tag1 = Tag(name='同学')
tag2 = Tag(name='好朋友')
tag1.users.append(art1)
tag1.users.append(art2)
tag2.users.append(art2)
tag2.users.append(art3)
db.session.add(art1)
db.session.add(art2)
db.session.add(art3)
db.session.add(tag1)
db.session.add(tag2)
db.session.commit()
for a in tag1.users:
print(a.name)
for t in art2.tags:
print(t.name)
运行代码:
D:\test>flask dbinit
删除数据库和表
创建数据库!
数据库创建成功!
D:\test>flask test_mtom
张三
李四
同学
好朋友