Как получить обратную ссылку на объект Association - то есть user.follows () и user.followers () - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь создать объект ассоциации UserRelationship, который определяет отношения "follow" между User и User.

class UserRelationship(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    follows_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    follower_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    follows = db.relationship("User", foreign_keys=[follows_id])
    follower = db.relationship("User", foreign_keys=[follower_id])
    bank = db.Column(db.Float)

    def __repr__(self):
        return f'{self.follower.username} follows {self.follows.username} with {self.bank}'



class User(UserMixin, db.Model):

    follows = db.relationship('UserRelationship',
                              primaryjoin=(UserRelationship.follower_id == id),
                              backref=db.backref('followers'),
                              lazy='dynamic')

    def follow(self, user, bank):
        if not self.is_following(user):
            new_follow = UserRelationship(bank=bank)
            new_follow.follows = user
            self.follows.append(new_follow)
            db.session.commit()
            return new_follow

    def unfollow(self, user):
        if self.is_following(user):
            relationship = self.follows.filter(UserRelationship.follows == user).first()
            db.session.delete(relationship)
            db.session.commit()
            return self.follows.all()

    def is_following(self, user):
        return self.follows.filter(
            UserRelationship.follows == user).count() > 0

Это приводит к ожидаемым результатам в оболочке:

joe=User(username='joe')
paul=User(username='paul')
phil=User(username='phil')

phil.follow(joe,bank=123)
[phil follows joe with 123]


Поэтому, когда я использую User.follows, меня перенаправляют на объект UserRelationship, который я могу запросить, чтобы получить всех людей. ЭТО пользователь следует. Я понимаю. Чего я не могу понять, так это как заставить пользователей User.followers работать. То, что я хотел бы, это запрос (или список) или User.followers. Команда backref не работает = ввод 'phil.followers' в консоль приводит к

Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'followers'

Возможно, я мог бы написать функцию? Но я не совсем уверен, что я напишу, чтобы запросить базу данных, чтобы получить список пользователей, которые все следуют за определенным пользователем.

1 Ответ

0 голосов
/ 06 ноября 2019

Я понял это - это было довольно просто:

    def followers(self):
        return UserRelationship.query.filter_by(follows=self).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...