Django rest framework 如何使用自定义逻辑创建序列化程序?
输入只有两个参数:Django rest framework 如何使用自定义逻辑创建序列化程序?,django-rest-framework,Django Rest Framework,输入只有两个参数: param1=Int,可选 param2=Char,需要 在输出时-json,包含4个元素 key1=Char 键2=Int 键3=Int 键4=Int 一切都可以是空的 现在我已经在get方法的视图中实现了它,但是我想为它创建一个序列化器,并将所有的逻辑放在那里,但是我真的不知道在哪里传输逻辑-验证,到_表示 现在看起来像这样 视图.py class ExampleRetrieveApiView(APIView): def get(self, request, *a
json
,包含4个元素
get方法的视图中实现了它,但是我想为它创建一个序列化器
,并将所有的逻辑放在那里,但是我真的不知道在哪里传输逻辑-验证
,到_表示
现在看起来像这样
视图.py
class ExampleRetrieveApiView(APIView):
def get(self, request, *args, **kwargs):
# A lot of logic related with input parameters.
return Response({
'key1': value1,
'key2': value2,
'key3': value3,
'key4': value4
})
class ExampleRetrieveApiView(APIView):
serializer_class = ExampleSerializer
def get(self, request):
serializer = ExampleSerializer(???)
return Response(serializer.data)
class ExampleSerializer(serializers.Serializer):
???
我需要做些像这样的事情
视图.py
class ExampleRetrieveApiView(APIView):
def get(self, request, *args, **kwargs):
# A lot of logic related with input parameters.
return Response({
'key1': value1,
'key2': value2,
'key3': value3,
'key4': value4
})
class ExampleRetrieveApiView(APIView):
serializer_class = ExampleSerializer
def get(self, request):
serializer = ExampleSerializer(???)
return Response(serializer.data)
class ExampleSerializer(serializers.Serializer):
???
序列化程序.py
class ExampleRetrieveApiView(APIView):
def get(self, request, *args, **kwargs):
# A lot of logic related with input parameters.
return Response({
'key1': value1,
'key2': value2,
'key3': value3,
'key4': value4
})
class ExampleRetrieveApiView(APIView):
serializer_class = ExampleSerializer
def get(self, request):
serializer = ExampleSerializer(???)
return Response(serializer.data)
class ExampleSerializer(serializers.Serializer):
???
将输入参数作为dict传递。然后,应使用SerializerMethodField()进行此操作:
from rest_framework import serializers
class ExampleSerializer(serializers.Serializer):
key1 = serializers.SerializerMethodField()
key2 = serializers.SerializerMethodField()
key3 = serializers.SerializerMethodField()
key4 = serializers.SerializerMethodField()
def get_key1(self, obj):
# do some calculations, let's say we want to return input1 multiplied by 2
# I'm accessing obj data and if it's empty assigning 0, you can add your own check instead
return obj.get('input1', 0)*2
def get_key2(self, obj):
# same deal, do whatever calculations you want with the input data
return obj.get('input2')
def get_key3(self, obj):
# your logic
return
def get_key4(self, obj):
return
对于声明为SerializerMethodField的每个字段,都应该有一个对应的get\u field方法
如何获取输入参数取决于您,您可以通过查询参数或主体数据来实现。
在视图中像这样调用序列化程序,例如使用body参数:
类示例示例RetrieveApiView(APIView):
视图
class ExampleAPIView(APIView):
serializer_class = ExampleSerializer
def get(self, request):
serializer = ExampleSerializer(data=request.query_params)
if serializer.is_valid(raise_exception=True):
return(Response(serializer.data))
class ExampleSerializer(serializers.Serializer):
param1 = serializers.IntegerField()
param2 = serializers.CharField()
def validate(self, data):
#custom logic
data['param3'] = 'text'
#another params
return data
def to_representation(self, data):
return {
'key1': data['param3']
'key2': data['param4']
#another key for representation
}
序列化程序
class ExampleAPIView(APIView):
serializer_class = ExampleSerializer
def get(self, request):
serializer = ExampleSerializer(data=request.query_params)
if serializer.is_valid(raise_exception=True):
return(Response(serializer.data))
class ExampleSerializer(serializers.Serializer):
param1 = serializers.IntegerField()
param2 = serializers.CharField()
def validate(self, data):
#custom logic
data['param3'] = 'text'
#another params
return data
def to_representation(self, data):
return {
'key1': data['param3']
'key2': data['param4']
#another key for representation
}
这也是可行的,但就我个人而言,我不会在validate中实现实际用于计算/转换输入的逻辑。验证的目的是以某种非标准的方式验证输入。在你的例子中,你实际上是在把输入转换成不同的东西。