如何在Django REST中判断用户间的关注关系及互关状态?
解决互关关系判断的方案
我来帮你搞定这个互关判断的逻辑!核心思路是在序列化器中添加自定义字段,判断当前登录用户(也就是被关注者followee)是否关注了这个关注你的用户(follower),然后把这个判断结果传给前端,让前端决定是否显示「回关」按钮。
步骤1:修改序列化器,添加互关判断字段
首先创建(或修改)你的UserFollowerSerializer,使用SerializerMethodField来生成自定义的互关状态字段:
from rest_framework import serializers from .models import Follow from django.contrib.auth import get_user_model User = get_user_model() class UserFollowerSerializer(serializers.ModelSerializer): # 序列化关注者的基础信息(可根据你的需求调整字段) follower_username = serializers.CharField(source='follower.username') follower_avatar = serializers.URLField(source='follower.avatar', allow_null=True) # 自定义互关状态字段 is_mutual_follow = serializers.SerializerMethodField() class Meta: model = Follow fields = ['id', 'follower', 'follower_username', 'follower_avatar', 'created_at', 'is_mutual_follow'] def get_is_mutual_follow(self, obj): # obj是当前的Follow实例,obj.follower就是关注你的用户 current_user = self.context['request'].user # 判断当前用户是否关注了这个follower return Follow.objects.filter(follower=current_user, followee=obj.follower).exists()
步骤2:在视图中传递request上下文给序列化器
修改你的FollowerAPIView,在实例化序列化器时把request传入context,这样序列化器才能拿到当前登录用户:
class FollowerAPIView(APIView,PaginationHandlerMixin): pagination_class = BasicPagination serializer_class = UserFollowerSerializer def get(self,request,*args,**kwargs): follower_qs = Follow.objects.filter(followee = request.user).select_related('follower') page = self.paginate_queryset(follower_qs) # 实例化序列化器时传入request上下文 serializer_context = {'request': request} if page is not None: serializer = self.get_paginated_response( self.serializer_class(page, many=True, context=serializer_context).data ) else: serializer = self.serializer_class(follower_qs, many=True, context=serializer_context) return Response(serializer.data,status=status.HTTP_200_OK)
逻辑说明
- 你的
Follow模型中,related_name='following'表示:user.following会返回该用户主动关注的所有人(即该用户作为follower的所有Follow实例);related_name='followers'表示:user.followers会返回关注该用户的所有人(即该用户作为followee的所有Follow实例)。 - 在
get_is_mutual_follow方法中,我们判断当前用户(request.user)是否存在一条follower=当前用户,followee=关注你的用户的Follow记录——如果存在,说明你们是互关状态;反之则是对方单方面关注你,前端可以根据is_mutual_follow=false来显示「回关」按钮。
前端处理示例
拿到接口返回的数据后,你可以这样判断:
// 假设接口返回的每个item结构如下: // { // "id": 1, // "follower_username": "xxx", // "is_mutual_follow": false, // ... // } items.forEach(item => { if (!item.is_mutual_follow) { // 渲染回关按钮 renderFollowBackButton(item.follower); } else { // 渲染已互关状态 renderMutualFollowStatus(); } });
内容的提问来源于stack exchange,提问作者Soumen Khatua
相关产品推荐
相关产品推荐

