返回介绍

关注和取消关注

发布于 2025-01-02 21:53:51 字数 1841 浏览 0 评论 0 收藏 0

感谢 SQLAlchemy ORM,一个用户关注另一个用户的行为可以通过 followed 关系抽象成一个列表来简便使用。 例如,如果我有两个用户存储在 user1user2 变量中,我可以用下面这个简单的语句来实现:

user1.followed.append(user2)

要取消关注该用户,我可以这么做:

user1.followed.remove(user2)

即便关注和取消关注的操作相当容易,我仍然想提高这段代码的可重用性,所以我不会直接在代码中使用“appends”和“removes”,取而代之,我将在 User 模型中实现“follow”和“unfollow”方法。 最好将应用逻辑从视图函数转移到模型或其他辅助类或辅助模块中,因为你会在本章之后将会看到,这使得单元测试更加容易。

下面是用户模型中添加和删除关注关系的代码变更:

class User(UserMixin, db.Model):
    #...

    def follow(self, user):
        if not self.is_following(user):
            self.followed.append(user)

    def unfollow(self, user):
        if self.is_following(user):
            self.followed.remove(user)

    def is_following(self, user):
        return self.followed.filter(
            followers.c.followed_id == user.id).count() > 0

follow()unfollow() 方法使用关系对象的 append()remove() 方法。有必要在处理关系之前,使用一个 is_following() 方法来确认操作的前提条件是否符合,例如,如果我要求 user1 关注 user2 ,但事实证明这个关系在数据库中已经存在,我就没必要重复操作了。 相同的逻辑可以应用于取消关注。

is_following() 方法发出一个关于 followed 关系的查询来检查两个用户之间的关系是否已经存在。 你已经看到过我使用 SQLAlchemy 查询对象的 filter_by() 方法,例如,查找给定用户名的用户。 我在这里使用的 filter() 方法很类似,但是更加偏向底层,因为它可以包含任意的过滤条件,而不像 filter_by() ,它只能检查是否等于一个常量值。 我在 is_following() 中使用的过滤条件是,查找关联表中左侧外键设置为 self 用户且右侧设置为 user 参数的数据行。 查询以 count() 方法结束,返回结果的数量。 这个查询的结果是 01 ,因此检查计数是 1 还是大于 0 实际上是相等的。 至于其他的查询结束符 all()first() ,你已经看到我使用过了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文