参考:

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 这样写的原理是什么,估计是文档没有看仔细。

现在只能以这样的理解来记忆,之后再详细研究研究。

12-25 20:56