Просмотр отношений SQLAlchemy - определение пользователей, которым понравился пост

Я новичок в фляжке и sql-алхимии. У меня проблемы с отношениями между разными моделями. В частности, я пытаюсь распечатать в интерфейсном HTML имена пользователей, которым понравился конкретный пост.

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True) 
    posts = db.relationship('Post', backref='author', lazy=True)
    posts = db.relationship('Post', backref='author', primaryjoin="User.id==Post.author_id")
    ...


    liked = db.relationship(
        'PostLike',
        foreign_keys='PostLike.user_id',
        backref='user', lazy='dynamic')


    def like_post(self, post):
        if not self.has_liked_post(post):
            like = PostLike(user_id=self.id, post_id=post.id)
            db.session.add(like)

    def unlike_post(self, post):
        if self.has_liked_post(post):
            PostLike.query.filter_by(
                user_id=self.id,
                post_id=post.id).delete()

    def has_liked_post(self, post):
        return PostLike.query.filter(
            PostLike.user_id == self.id,
            PostLike.post_id == post.id).count() > 0


class PostLike(db.Model):
    __tablename__ = 'post_like'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    recipient_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    likes = db.relationship('PostLike', backref='post', lazy='dynamic')
    ...

В моем приложении Flask при распечатке сообщений я хочу иметь возможность отображать имена пользователей, лайкнувших сообщение. Мне удалось заставить работать подобную функцию и отображать количество лайков с помощью:

{{ post.likes.count() }}

через jinja2 в интерфейсе HTML.


person aj3409    schedule 06.07.2019    source источник


Ответы (1)


Поскольку ваша post_like таблица - это просто пара двух строк в разных таблицах, вы можете использовать вторичную связь, чтобы напрямую связаться с объектом пользователя.

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    recipient_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    likes = db.relationship('User', secondary='post_like',
                            backref=db.backref('post', lazy='dynamic'))

Если вы хотите добавить больше столбцов во вторичную таблицу, вам придется использовать более сложную шаблон объекта ассоциации.

Кроме того, у вас не должно быть двух posts отношений, их нужно объединить.

person Nick K9    schedule 06.07.2019
comment
Спасибо, он отображает имена пользователей. Однако как мне отобразить количество лайков? {{ post.likes.count() }} возвращает эту ошибку TypeError: count() takes exactly one argument (0 given). С другой стороны, {{ post.likes.count }} возвращает объект <built-in method count of InstrumentedList object at 0x000001853C484958> на странице HTML. - person aj3409; 07.07.2019
comment
Вам необходимо сделать это в Jinja. - person Nick K9; 07.07.2019