Обход отношений SQLAlchemy - определение пользователей, которым понравился пост - PullRequest
0 голосов
/ 06 июля 2019

Я довольно новичок в колбе и 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')
    ...

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

{{ post.likes.count() }}

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

1 Ответ

0 голосов
/ 06 июля 2019

Поскольку ваша таблица 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'))

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

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

...