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

如何在Django中为认证用户实现获取其关注用户的ViewSet查询集过滤

解决Django ViewSet中获取当前用户关注列表的查询集过滤问题

我来帮你搞定这个问题!你现在的需求是让已认证用户在ViewSet里获取自己关注的用户列表,之前的过滤条件逻辑搞反了,咱们来一步步修正。

先回顾下你的模型关系:

  • UserFollow里,author是发起关注的用户(也就是当前请求的request.user),profile是被关注的目标用户。
  • User模型的following反向关联对应所有该用户发起的关注记录,followers反向关联对应所有关注该用户的记录。

你之前用following__author = request.user过滤,返回的是当前用户自己,原因很简单:这个条件是在User集合里找那些拥有一条关注记录(following)且该记录的发起者(author)是当前用户的用户,而当前用户自己的following记录的author就是他自己,所以自然只返回自己了。

正确的过滤器实现

有两种简洁的写法,选哪种都可以:

写法一:直接通过反向关联过滤

class FollowedUserFilterBackend(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 筛选出所有被当前用户关注的用户
        # 逻辑:User的followers关联的是所有关注他的UserFollow记录
        # 我们要找的是这些记录里author为当前用户的User对象,也就是当前用户关注的人
        return queryset.filter(followers__author=request.user)

写法二:先获取关注用户ID再过滤

如果觉得第一种逻辑有点绕,可以先拿到当前用户所有关注记录里的目标用户ID,再用ID过滤:

class FollowedUserFilterBackend(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 先取出当前用户所有关注记录中的profile(被关注用户)的ID列表
        followed_user_ids = request.user.following.values_list('profile__id', flat=True)
        # 过滤出ID在列表中的用户
        return queryset.filter(id__in=followed_user_ids)

验证一下

两种写法都能实现你的需求:

  • 写法一利用Django的ORM关联查询,直接通过反向关联followers找到符合条件的用户。
  • 写法二先提取ID列表再过滤,逻辑更直观,适合关联关系复杂的场景。

最后确保你的模型related_name配置正确:

  • UserFollow的author字段related_name='following':正确,代表用户发起的所有关注记录。
  • UserFollow的profile字段related_name='followers':正确,代表所有关注该用户的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:37:49