【问题标题】:Traversing SQLAlchemy relationships - determining users that liked a post遍历 SQLAlchemy 关系 - 确定喜欢帖子的用户
【发布时间】:2019-11-16 13:33:16
【问题描述】:

我对烧瓶和 sql-alchemy 比较陌生。我在处理不同模型之间的关系时遇到了麻烦。具体来说,我正在尝试将喜欢特定帖子的用户的用户名打印到前端 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')
    ...

在我的烧瓶应用程序中,当打印帖子时,我希望能够显示帖子喜欢者的用户名。我已经能够让like函数工作并显示喜欢的数量,通过:

{{ post.likes.count() }}

通过 HTML 前端中的 jinja2。

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案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'))
    

    如果您想向辅助表添加更多列,则必须使用更复杂的Association Object 模式。

    另外,您不应该有两个 posts 关系,它们需要合并。

    【讨论】:

    • 谢谢,它确实显示了用户名。但是,我将如何显示喜欢的人数? {{ post.likes.count() }} 返回此错误 TypeError: count() takes exactly one argument (0 given)。另一方面,{{ post.likes.count }} 在 HTML 页面中返回对象 <built-in method count of InstrumentedList object at 0x000001853C484958>
    • 您需要do that in Jinja
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2020-12-12
    • 2020-09-03
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多