【问题标题】:Django rest framework nested serializer inside non-model serializer非模型序列化器中的 Django rest 框架嵌套序列化器
【发布时间】:2017-11-15 05:58:52
【问题描述】:

我有一个页面,其中很少有单独的序列化程序,并且它们没有关系。与其一一调用,我想一次性调用所有(只列出来,不写,别着急写)。

所以想创建一个单独的序列化器,其中每个序列化器都作为字段(嵌套序列化器)。

像这样:

class MarkSerializer(serializers.ModelSerializer):
     # Shows list of marks
     class Meta:
         model = Mark
         fields = blah blah

class TopCricketerSerializer(serializers.ModelSerializer):
    # Show list of top cricketers


and more..

这是我正在计划的通用序列化程序:

CommonSerializer(serializers.Serializer): # Correct me if am using wrong serializer of if no serializer needed 
    marks = MarkSerializer(many=True)
    top_cricketers = TopCricketerSerializer(many=True)
    # more such non-related fields

如果我不清楚,请告诉我。

【问题讨论】:

  • 那么问题是什么?
  • 我认为真正的问题是您将如何将数据传递给序列化程序!
  • 那么,这个问题有什么有用的答案吗?
  • @CarMoreno,我留下了一个例子的答案。你可以检查一下

标签: django django-rest-framework


【解决方案1】:

您的序列化程序看起来适合只读操作。更多信息请参见this answer

要使此序列化程序可写(如果有必要),您需要在您的 CommonSerializer 中包含 create 和/或 update 方法为 in the docs

【讨论】:

  • 我的问题仅用于阅读/加载。只需要一次加载,不用担心写不完。
【解决方案2】:

你正确理解了一切。这是一个外观示例

# serializers.py
from rest_framework import serializers
from .models import Mark, TopCricketer

class MarkSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mark
        fields = "__all__"

class TopCricketerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mark
        fields = "__all__"

class CommonSerializer(serializers.Serializer):
    marks = MarkSerializer(many=True)
    top_cricketers = TopCricketerSerializer(many=True)

    def create(self, validated_data):
        marks = MarkSerializer(data=validated_data['marks'], many=True)
        marks.is_valid(raise_exception=True)
        marks.save()

        top_cricketers = TopCricketerSerializer(data=validated_data['top_cricketers '], many=True)
        top_cricketers.is_valid(raise_exception=True)
        top_cricketers.save()

        return self.__class__({'marks': marks, 'top_cricketers ': top_cricketers})

# views.py
from rest_framework import generics, status
from rest_framework.response import Response
from .serializers import CommonSerializer
from .models import Mark, TopCricketer


class CommonAPIView(generics.GenericAPIView):
    serializer_class = CommonSerializer
    
    # retrieve
    def get(self, request, *args, **kwargs):
        marks = Mark.objects.all()
        top_cricketers = TopCricketer.objects.all()
        serializer= self.get_serializer({'marks': marks, 'top_cricketers ': top_cricketers})
        return Response(serializer.data)
   
   # create
   def post(self, request, *args, **kwargs):
        serializer= self.get_serializer(data = request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

【讨论】:

    猜你喜欢
    • 2014-07-26
    • 2016-08-01
    • 2016-04-07
    • 2012-11-16
    • 2018-12-13
    • 2013-03-31
    • 2021-06-23
    • 1970-01-01
    • 2020-04-23
    相关资源
    最近更新 更多