参考:
https://www.jianshu.com/p/2c6c76f94b88
例子模型:粉丝机制
1.User可以关注其他User,产生一个关注列表,我们定义为followed
2.User可以拥有自己的粉丝,产生一个粉丝列表,我们定义为follower
参考代码
mid_table = db.Table('mid_table', # follower_id:User的粉丝是谁 # followed_id:User关注了谁 db.Column('follower_id', db.Integer, db.ForeignKey('user.id')), db.Column('followed_id', db.Integer, db.ForeignKey('user.id')) ) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) # 这里定义的followed是什么呢? # 答:指User关注了谁 followed = db.relationship( #指定引用的表,也就是自己 'User', # secondary 指定了用于该关系的关联表 # 就是使用我在上面定义的 followers secondary=followers, # 要知道User关注了谁,就用primaryjoin来实现 # 怎么才能知道User关注了谁呢? # 这里站在对面的角度看看谁的粉丝是User,即 中间表.c.粉丝_id == User.id # 执行 user.followed 时候就是这样的查找 primaryjoin=(mid_table.c.follower_id == id), # 同primaryjoin类似 # 怎么才能知道User的粉丝是谁呢? # 站在对面的角度看看谁关注了User,即 中间表.c.关注了谁_id == User.id
# 执行user.followers的时候就是这样的查找 secondaryjoin=(mid_table.c.followed_id == id), # backref 定义了右侧实体如何访问该关系 # 也就是根据右侧实体查找对应的左侧对象 # 在左侧,关系被命名为 followed # 在右侧使用 followers 来表示所有左侧用户的列表,即粉丝列表 backref=db.backref('followers', lazy='dynamic'), lazy='dynamic' ) posts = db.relationship('Post', backref='author', lazy='dynamic') class Post(db.Model): id = db.Column(db.Integer, primary_key=True) body = db.Column(db.String(140)) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) def __repr__(self): return '<Post {}>'.format(self.body)
看了看官方文档,[ Self-Referential Many-to-Many Relationship ]这一部分说了自引用关系,但是并没有说 primaryjoin 和 secondaryjoin 这样写的原理是什么,估计是文档没有看仔细。
现在只能以这样的理解来记忆,之后再详细研究研究。