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

