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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:32:58