from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:ccc@127.0.0.1:3306/many2many'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = False
db = SQLAlchemy(app)
tb_user_follows = db.Table(
'tb_user_follows',
db.Column('follower_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
db.Column('followed_id', db.Integer, db.ForeignKey('user.id'), primary_key=True)
)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True, nullable=False)
# 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人;加个括号会比较容易理解,同理secondaryjoin也是这样
followers = db.relationship('User', secondary=tb_user_follows,
primaryjoin=(id == tb_user_follows.c.followed_id),
secondaryjoin=id == tb_user_follows.c.follower_id,
backref = db.backref('followed', lazy='dynamic'),
lazy= 'dynamic'
)
if __name__ == '__main__':
db.drop_all()
db.create_all()
u1 = User(name='cc')
u2 = User(name='ccdefans')
u3 = User(name='superstar')
u4 = User(name='ccdefans2')
u1.followers = [u2, u4]
u3.followers = [u1, u2, u4]
db.session.add_all([u1, u2, u3, u4])
db.session.commit()
db.session.commit()
app.run(debug=True)
添加数据后,查看两张表单,即可看到一张存储的是用户,一张存储的是用户关系表。
用户关系的字段顺序可以更改,但其指向的引用是自关联多对多的索引
这个是数据表
这个是多对多自关联关系表,可以很清晰地看出字段是如何引用的