25

Flask Mega Tutorialの Flask-SQLAlchemy の内容を理解するのに苦労しています。コードは次のとおりです。

followers = db.Table('followers',
    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)
    nickname = db.Column(db.String(64), unique = True)
    email = db.Column(db.String(120), index = True, unique = True)
    role = db.Column(db.SmallInteger, default = ROLE_USER)
    posts = db.relationship('Post', backref = 'author', lazy = 'dynamic')
    about_me = db.Column(db.String(140))
    last_seen = db.Column(db.DateTime)
    followed = db.relationship('User', 
        secondary = followers, 
        primaryjoin = (followers.c.follower_id == id), 
        secondaryjoin = (followers.c.followed_id == id), 
        backref = db.backref('followers', lazy = 'dynamic'), 
        lazy = 'dynamic')

    def follow(self, user):
        if not self.is_following(user):
            self.followed.append(user)
            return self

    def unfollow(self, user):
        if self.is_following(user):
            self.followed.remove(user)
            return self

    def is_following(self, user):
        return self.followed.filter(followers.c.followed_id == user.id).count() > 0

したがって、これは自己参照関係であるため、テーブル内のどのユーザーがフォロワーであり、テーブル内のどのユーザーがフォローされているかを関連付けテーブルが把握するための何らかの方法が必要であることを理解しています。Primaryjoinこれをsecondaryjoin達成しますが、どのように?

primaryjoin私が理解していない3つのことはsecondaryjoin次のとおりです。

  1. 平等primaryjoinをチェックする目的は何ですか? secondaryjoinまたは、言い換えると、どのようにしてs を関連付けテーブルにprimaryjoin追加secondaryjoinするのでしょうか?user.id
  2. と の両方が要件primaryjoinsecondaryjoin取るので、どちらがどこに行くのでしょうか?user.iduser.id
  3. 私の follow/unfollow メソッドで、SQLAlchemy は自分自身がフォロワーであり、渡されたユーザーがフォローされていることをどのように認識しますか?

これらの質問は、私が次の章に進むのを妨げてきたので、どんな回答でも大歓迎です.

4

1 に答える 1