Получение сообщений для пользователей на основе зарубежных лайков - PullRequest
0 голосов
/ 09 июля 2020

У меня возникли проблемы при выполнении идиоматического c соединения с SQLAlchemys DSL. Я хочу получить все сообщения, которые понравились конкретному пользователю, но я не могу получить список сообщений.

Модели

Модель сообщения

class Post(SearchableMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))

    likes = db.relationship('PostLike', backref='post', lazy='dynamic')

    def __repr__(self):
        return "<Post {}>".format(self.body)

PostLike Model

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'))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)

Модель пользователя

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    posts = db.relationship("Post", backref="author", lazy="dynamic")
    about_me = db.Column(db.String(140))
    location = db.Column(db.String(100))
    is_private = db.Column(db.Boolean, default=False)
    mailbox_enabled = db.Column(db.Boolean, default=True)
    last_seen = db.Column(db.DateTime, default=datetime.utcnow)

Что я пробовал

user = User.query.filter_by(username=username).first()
    
# this gets the posts likes successfully
liked_posts = user.liked.order_by(PostLike.timestamp.desc())

# This is where I attempt the join - not working
new_posts = Post.query.join(
    "liked_posts", Post.id == liked_posts
)

print(new_posts)

1 Ответ

0 голосов
/ 09 июля 2020

Вам необходимо использовать атрибут secondary функции relationship, он позволяет определять отношения «многие ко многим»:

class User(UserMixin, db.Model):
    # Some columns and relationships here
    liked_posts = db.relationship("Post", secondary="post_like", backref="users_liked")

С его помощью вы сможете получить доступ к списку Post объекты, понравившиеся пользователю:

liked_posts = user.liked_posts

Подробнее о отношениях многие-ко-многим и других типах отношений в документации по SQLAlchemy (он поддерживает некоторые очень необычные комбинации).

...