如何通过MultipleChoiceField序列化JSON时保留顺序

时间:2019-01-27 16:09:24

标签: django django-serializer

我有一个有效选择的预定义列表:

allowed_choices = ['yes', 'no', 'I dont know']

我正在使用Django rest框架开发API。为了验证和序列化输入,我使用Django字段。为此,我选择了MulitpleChoiceField

dataColumns = serializers.MultipleChoiceField(
    choices=allowed_choices,
    allow_blank=False,
    source="data_Columns",
)

我的视图如下:

import json

# REST IMPORTS
from rest_framework import viewsets, response, status, serializers

# DJANGO IMPORTS
from django.http import HttpResponse


class TestSerializer(serializers.Serializer):

    dataColumns = serializers.MultipleChoiceField(
        choices=allowed_choices,
        allow_blank=False,
        source="data_Columns",
    )


class TestViewSet(viewsets.ViewSet):

    def list(self, request):
        return response.Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def retrieve(self, request, pk=None):
        return response.Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def update(self, request, pk=None):
        return response.Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def partial_update(self, request, pk=None):
        return response.Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def destroy(self, request, pk=None):
        return response.Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def create(self, request):
        serializer = TestSerializer(data=request.data)

        if serializer.is_valid(raise_exception=True):
            try:

                print(serializer.validated_data.get("data_Columns"))

                json_return = json.dumps(["all good"])

                return HttpResponse(json_return,
                                    content_type='application/json')
            except:
                return HttpResponse(status=status.HTTP_500_INTERNAL_SERVER_ERROR,
                                    content_type='application/json')
        else:
            return HttpResponse(json.dumps(serializer.errors),
                                content_type='application/json',
                                status=status.HTTP_400_BAD_REQUEST)

如果使用以下json输入进行API调用:

{
        "dataColumns": ["no", "yes"]
}

然后在validated_data中打印["yes", "no"]。但是输入是相反的。我的目标是保留此顺序。实际上,有效的选择是一个更大的领域,我无法(希望)用户强制执行我的订单。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。如果我将ListField与孩子ChoiceField一起使用,则to_internal_value返回list而不是集合(在MultipleChoiceField中)。这意味着订单被保留。

dataColumns = serializers.ListField(
    child=serializers.MultipleChoiceField(
        choices=allowed_choices,
        allow_blank=False),
    source="data_Columns"
)