Django use Different Serializer based on parameter

◇◆丶佛笑我妖孽 提交于 2020-03-05 03:55:06

问题


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']

回答1:


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


来源:https://stackoverflow.com/questions/60193163/django-use-different-serializer-based-on-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!