You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django多对多关系下检查用户是否关注他人的高效方法

优化Django关注状态判断的ORM实现

你的checkFollows方法通过遍历所有关注用户判断状态,当关注列表较大时会产生不必要的性能开销,而且代码可以更简洁。下面用Django ORM提供几种优化方案:

1. 用exists()直接判断存在性

这是最推荐的方式,Django ORM的exists()会生成高效的SQL查询,只检查数据库中是否存在对应关系,不会加载所有关注对象到内存:

def checkFollows(self, followCandidate):
    return self.follows.filter(pk=followCandidate.pk).exists()

如果追求极简写法,也可以直接用in判断,但注意这种方式会先获取所有关注对象,性能不如exists():

def checkFollows(self, followCandidate):
    return followCandidate in self.follows.all()

2. 序列化时一并返回关注状态(可选)

如果需要在获取目标用户信息时,同时返回当前用户是否关注对方的状态,可以扩展serialize方法,传入当前请求用户:

def serialize(self, request_user=None):
    data = {
        "followsCount": self.follows.count(),
        "followersCount": self.followers.count()
    }
    if request_user is not None:
        data["isFollowed"] = request_user.follows.filter(pk=self.pk).exists()
    return data

这样在接口返回用户信息时,就能直接拿到isFollowed字段,无需单独调用checkFollows方法。

额外优化建议

  • ManyToMany字段默认支持空关系,所以可以去掉follows字段的blank=True, null=True,简化模型定义:
follows = models.ManyToManyField("self", symmetrical=False, related_name="followers")
  • 计数时直接用self.follows.count()即可,不需要all().count(),前者会生成更高效的SQL计数语句。

内容的提问来源于stack exchange,提问作者MatchYouPikchu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:50:45