如何在Rest Framework中返回没有模型的多个列表?

时间:2017-11-16 08:19:25

标签: python django django-rest-framework

如何在Rest Framework中返回serval列表?

我有serializers.py

class HostTypeSerializer(ModelSerializer):

    class Meta:
        model = HostType
        fields = "__all__"
class DiskOSTypeSerializer(ModelSerializer):
    class Meta:
        model = DiskOSType
        fields = "__all__"
class DiskEssenceTypeSerializer(ModelSerializer):
    class Meta:
        model = DiskEssenceType
        fields = "__all__"

我有三个Serializers,我想返回类似下面的数据:

{
    hosttypes:[the HostTypeSerializer's list data ],
    diskostype:[the DiskOSTypeSerializer's list data],
    diskessencetype:[the DiskEssenceTypeSerializer's list data], 
}

我试过但失败了,但我不知道怎么办:

class DiskPreCreateSerialzer(ModelSerializer):
    hosttypes = HostTypeSerializer(many=True, read_only=True)
    diskostypes = DiskOSTypeSerializer(many=True, read_only=True)
    diskessencetypes = DiskEssenceTypeSerializer(many=True, read_only=True)
    class Meta:

        fields = (
            "hosttypes",
            "diskostypes",
            "diskessencetypes",
        )

在views.py中:

class DiskPreCreateAPIView(APIView):
    serializer_class = DiskPreCreateSerialzer
    permission_classes = []
    ...

我想使用此序列化程序返回我的要求,但失败了,我怎么能得到它?

修改

我现在不知道如何编写DiskPreCreateAPIView,因为我不知道如何返回数据。

class DiskPreCreateAPIView(APIView):
    serializer_class = DiskPreCreateSerialzer
    permission_classes = []

    def post(self, request):

        return Response(data=xxx, status=HTTP_200_OK)

1 个答案:

答案 0 :(得分:2)

尝试使用基础Serializer代替ModelSerializer

class DiskPreCreateSerialzer(Serializer):
    hosttypes = HostTypeSerializer(many=True, read_only=True)
    diskostypes = DiskOSTypeSerializer(many=True, read_only=True)
    diskessencetypes = DiskEssenceTypeSerializer(many=True, read_only=True)

在您的视图中,将带有列表的dict传递给此序列化程序:

class DiskPreCreateAPIView(APIView):
    serializer_class = DiskPreCreateSerialzer
    permission_classes = []

    def post(self, request):
        ...
        serializer = self.serializer_class({
            'hosttypes': hosttypes_qs,
            'diskostype':diskostype_qs,
            'diskessencetype': diskessencetype_qs,
        })
        return Response(data=serializer.data, status=HTTP_200_OK)