关注和取消关注
感谢 SQLAlchemy ORM,一个用户关注另一个用户的行为可以通过 followed
关系抽象成一个列表来简便使用。 例如,如果我有两个用户存储在 user1
和 user2
变量中,我可以用下面这个简单的语句来实现:
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()
方法结束,返回结果的数量。 这个查询的结果是 0
或 1
,因此检查计数是 1 还是大于 0 实际上是相等的。 至于其他的查询结束符 all()
和 first()
,你已经看到我使用过了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论