С трудом понимая некоторые вещи Flask-SQLAlchemy из Flask Mega Tutorial. Здесь код:
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
и secondaryjoin
, следующие:
- Какова цель
Primaryjoin
иsecondaryjoin
проверки равенства? Или, другими словами, как именноPrimaryjoin
иsecondaryjoin
добавляютuser.id
в таблицу ассоциаций? - Поскольку как
Primaryjoin
, так иsecondaryjoin
принимают требованиеuser.id
, котороеuser.id
идет туда, где? - В моих методах follow/unfollow, как SQLAlchemy знает, что "я" является последователем и что пользователь прошел через тот, за которым следует?
Эти вопросы удержали меня от перехода к следующей главе, поэтому любые ответы очень ценятся.