Django根据参数使用不同的序列化器 [英] Django use Different Serializer based on parameter
问题描述
我有一个提供模型实例的APIView。我想根据网址参数使用不同的序列化程序,因为我想根据参数提供不同的字段。我不想用其他方式检查所有情况,因此我使用了一个函数,该函数根据类型键从序列化器对象dict提供序列化器。有没有好的解决方案?有谁有更好的建议?
您还在考虑使用不同的端点而不是这种方法。
这是代码:
urls.py
从django.urls导入路径
从.views导入MySerializerTestView
urlpatterns = [
path('< slug:type>',MySerializerTestView.as_view()),
]
models.py
<$来自django.db的p $ p>
导入模型
类MyModel(models.Model):
field_first = models.CharField(max_length = 10)
field_second =模型。 CharField(max_length = 10)
field_third = models.CharField(max_length = 10)
views .py
来自.models import MyModel
来自rest_framework.response import响应
来自rest_framework.views import来自.serializers的APIView
导入MyFirstSerializer,MySecondSerializer,MyThirdSerializer
类MySerializerTestView(APIView):
def get(self,request,** kwargs):
my_data = MyModel.objects.all()
序列化器= self.ge t_serializer(self.kwargs ['type'],my_data)
返回响应(serializer.data)
def get_serializer(self,type,data):
my_serializers = {
'first':MyFirstSerializer(data,many = True),
'second':MySecondSerializer(data,many = True),
'third':MyThirdSerializer(data,many = True),
}
返回my_serializers [type]
serializers.py
from .models import MyModel
from rest_framework import serializers
class MyFirstSerializer(serializers。 ModelSerializer):
类Meta:
模型= MyModel
字段= ['field_first']
类MySecondSerializer(serializers.ModelSerializer):
类Meta :
模型= MyModel
字段= ['field_second']
类MyThirdSerializer(serializers.ModelSerializer):
类元:
模型= MyModel
字段= ['field_third']
您可以发送参数或根据执行的操作选择序列化器。
在 view.py文件中,可以使用 get_serializer_class(self)方法进行操作。
def get_serializer_class(self):
如果self.request.query_params中的参数:
返回ParameterSerializer
如果self.action == list或self.action =='retrieve':
return ListSerializer
else:
return CreateSerializer
I have a APIView that provides my model instances. I want to use different serializers based on url parameters, beacause I want to serve different fields based on parameter. I didn't want to use if else check for all situations, so I used a function that provide serializer from serializer objects dict based on type key. Is there a good solution? Does anyone have a better suggestion? Also what are you thinking about use different endpoints instead of this method. Here is the code:
urls.py
from django.urls import path
from .views import MySerializerTestView
urlpatterns = [
path('<slug:type>', MySerializerTestView.as_view()),
]
models.py
from django.db import models
class MyModel(models.Model):
field_first = models.CharField(max_length=10)
field_second = models.CharField(max_length=10)
field_third = models.CharField(max_length=10)
views.py
from .models import MyModel
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import MyFirstSerializer,MySecondSerializer,MyThirdSerializer
class MySerializerTestView(APIView):
def get(self, request, **kwargs):
my_data = MyModel.objects.all()
serializer = self.get_serializer(self.kwargs['type'],my_data)
return Response(serializer.data)
def get_serializer(self,type,data):
my_serializers = {
'first':MyFirstSerializer(data,many=True),
'second':MySecondSerializer(data,many=True),
'third':MyThirdSerializer(data,many=True),
}
return my_serializers[type]
serializers.py
from .models import MyModel
from rest_framework import serializers
class MyFirstSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['field_first']
class MySecondSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['field_second']
class MyThirdSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['field_third']
You can send a parameter or select the serializer based on the action that is taken.
In your "view.py" file you can use the "get_serializer_class (self)" method to do it.
def get_serializer_class(self):
if 'parameter' in self.request.query_params:
return ParameterSerializer
if self.action == "list" or self.action == 'retrieve':
return ListSerializer
else:
return CreateSerializer
这篇关于Django根据参数使用不同的序列化器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!