【问题标题】:Django use Different Serializer based on parameterDjango根据参数使用不同的序列化器
【发布时间】:2020-05-28 07:05:39
【问题描述】:

我有一个提供模型实例的 APIView。我想根据 url 参数使用不同的序列化程序,因为我想根据参数提供不同的字段。我不想使用 if else 检查所有情况,所以我使用了一个函数,该函数根据类型键从序列化器对象 dict 提供序列化器。有没有好的解决方案?有没有人有更好的建议? 另外,您在考虑使用不同的端点而不是这种方法。 代码如下:

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]

序列化器.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']

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    您可以根据所采取的操作发送参数或选择序列化程序。

    在您的“view.py”文件中,您可以使用“get_serializer_class (self)”方法来完成。

    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
    

    【讨论】:

    • 感谢您的建议。但这不是我正在寻找的答案。我不想使用 if else 检查。因为有很多可能性,我必须写 if else 用这种方法检查每个条件。我正在寻找有没有更好的解决方案。
    • 您可以根据自己的需要进行调整,不一定要使用“If”只是一个例子。使用“self.request.query_params.get('param', '')”你会得到值,可以是索引,例如:“type = self.request.query_params.get('param', '') return my_serializers [type]”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2021-10-11
    • 2021-09-10
    • 2017-11-24
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多