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
相关产品推荐
相关产品推荐

