如何过滤 Django 序列化器数据?

How to filter Django serializer data?

我正在尝试根据 JWT 中的用户名过滤数据。这就是我一直在尝试的方式:

views.py:

class TestView(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        token = request.META.get('HTTP_AUTHORIZATION', " ").split(' ')[1]
        data = {'token': token}
        try:
            valid_data = VerifyJSONWebTokenSerializer().validate(data)
            user = valid_data['user']
            request.user = user
            person = Person.objects.filter(userName=request.user)
        except ValidationError as v:
            print("validation error", v)
        return Response(person[0])

这是有效的,因为我可以使用 print("Person: ", person[0]) 获取人物数据。 return Response(person[0]) 但是 return 是一个错误:TypeError: Object of type Person is not JSON serializable。我想我可以使用序列化程序 class 来 return 一个有效的 JSON,对吗?我的 serializers.py:

里有这个
class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = '__all__'

我只是不知道如何根据我的观点使用它。如果我使用序列化程序而不是 person = Person.objects.filter(userName=request.user),应该如何进行过滤?

如果我完全不在正确的轨道上,请纠正我。

您是否在使用 Django-Rest-Framework(基于您对 ModelSerializer 的使用)?

在纯 Django 中,从 documentation on serializers 开始,您可以执行以下操作:

from django.core import serializers
json_response = serializers.serialize("json", person[0])
return Response(json_response)

如果您使用的是 Django-Rest-Framework:

return Response(TestSerializer(person[0]).data)

可以添加序列化器查看,提供查询结果给序列化器,获取序列化数据:

class TestView(APIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = TestSerializer  # add serializer

    def get(self, request):
        token = request.META.get('HTTP_AUTHORIZATION', " ").split(' ')[1]
        data = {'token': token}
        try:
            valid_data = VerifyJSONWebTokenSerializer().validate(data)
            user = valid_data['user']
            request.user = user
            person = Person.objects.filter(userName=request.user).last()
            data = self.serializer_class(instance=person).data  # serialize query result
        except ValidationError as v:
            print("validation error", v)
            raise v
        return Response(data)  # return serialized response

Here 您可以找到一些将序列化器与基于 class 的视图一起使用的示例。

另请注意,您的 Person 模型可能包含密码等安全敏感字段,因此最好在序列化程序中指定您需要的确切字段,而不是使用 fields = '__all__'.