Django Rest Framework 序列化程序检查相关多对多字段中是否存在

Django Rest Framework serializer check if exists in related Many to Many fiield

我有一个自定义用户模型,其中 blocked 字段为

class User(AbstractUser):
    username = None
    email = models.EmailField(_('email address'), unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    blocked = models.ManyToManyField("User", related_name="blocked_by", blank=True)

我正在尝试使用一个序列化程序,我可以在其中通过用户 ID 查找用户并确定他们是否被登录用户阻止

我当前是序列化器

class UserSerializer(serializers.ModelSerializer):
    is_blocked = serializers.BooleanField() # need to populate this

    class Meta:
        model = User
        fields = ['id', 'email', 'user_type', 'is_blocked']

和我的观点

class UserDetail(generics.RetrieveAPIView):
    authentication_classes = (authentication.JWTAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)

    serializer_class = UserSerializer
    queryset = User.objects.all()

我只是不确定如何填充该值,以便查询的用户是否在已登录用户的 blocked manyToMany 字段中是否为真

你可以用SerializerMethodField计算一下。获取认证用户并检查序列化用户是否在阻止列表中。

class UserSerializer(serializers.ModelSerializer):
    is_blocked = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ['id', 'email', 'user_type', 'is_blocked']

    def get_is_blocked(self, obj):
        # you might need to do some fixes in this method, I'm not 100% sure that it works like you want
        logged_in_user = self.context['request'].user  # the authenticated user
        is_blocked = logged_in_user.blocked.filter(id=obj.id).exists()  # check if the serialized user (obj) is in the auth user blocked list
        return is_blocked