首页 > 解决方案 > 如何从不同的模型制作自定义序列化器?

问题描述

我有 3 种不同的型号。我需要用这 3 个模型构建一个自定义序列化程序。我尝试使用一些代码,但没有达到我的预期。有结构,但我无法获得我期望的数据

# Serializer This my Serializer 和 ModelOne、ModelTwo、ModelThree 这些是我的模型。

class ModelOneSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelOne
        fields = ['id', 'obj_1', 'obj_2']


class ModelTwoSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelTwo
        fields = ['id', 'obj_1', 'obj_2']


class ModelThreeSerializer(WritableNestedModelSerializer):
    class Meta:
        model = ModelThree
        fields = ['id', 'obj_1', 'obj_2']



class CustomSerializer(serializers.Serializer):
    model_1 = ModelOneSerializer(many=True)
    model_2 = ModelTwoSerializer(many=True)
    model_3 = ModelThreeSerializer(many=True)

# 看法


class CustomView(APIView):
    def get(self, request, *args, **kwargs):
        serializer = CustomSerializer(context={'request': request})
        return Response({'response': 'ok', 'result': serializer.data})

# 预期输出


    {
    "response": "ok",
    "result": {
        "model_1": [
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        },
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        }
        ],
        "model_2": [
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        }
        ],
        "model_3": [
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        }
        ]
    }
}

结果可能在model_2和model_3中有多个数据,就像在model_1结构中一样

标签: djangodjango-rest-frameworkserialization

解决方案


您没有为所有模型序列化程序传递要序列化的内容,因此没有CustomSerializer任何要序列化的对象。

您可以将模型的查询集传递给CustomSerializer

class CustomView(APIView):
    def get(self, request, *args, **kwargs):   
        model_one_qset = ModelOne.objects.all()
        model_two_qset = ModelTwo.objects.all()
        model_three_qset = ModelThree.objects.all()

        qsets_map = {
            'model_1': model_one_qset,
            'model_2': model_two_qset,
            'model_3': model_three_qset,
        }

        serializer = CustomSerializer(qsets_map, context={'request': request})

        return Response({'response': 'ok', 'result': serializer.data})

推荐阅读