Flask-SQLAlchemy学习笔记(4):多对多关系

使用多对多关系,首先需要定义一个用于关系的辅助表。对于这个辅助表, 强烈建议不使用模型,而是采用一个实际的表。这里使用了 UserTag 之间的多对多关系,一个联系人可以有多个标签,一个标签下也可以有多个联系人。关系辅助表一定要在模型表之前定义,不然创建表的时候容易报错。先定义关系辅助表:

#关系表要放到表的前边建立
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
张三
李四
同学
好朋友

你可能感兴趣的:(Flask-SQLAlchemy学习笔记(4):多对多关系)