如何过滤 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__'
.
我正在尝试根据 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__'
.