Как сохранить порядок в сериализации JSON через MultipleChoiceField

У меня есть заранее определенный список допустимого выбора:

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

Я работаю над API, используя среду отдыха Django. Для проверки и сериализации входных данных я использую поля 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)

Если выполнить вызов API со следующим вводом json:

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

Тогда в validated_data это печатает ["yes", "no"], Однако вход был наоборот. Моя цель - сохранить этот порядок. На самом деле действительный выбор - гораздо большая вселенная, и я не могу (хочу), чтобы пользователь заставил мой заказ.

1 ответ

Я нашел решение своей проблемы. Если я использую ListField с ребенком ChoiceField тогда to_internal_value возвращает list вместо набора (в MultipleChoiceField). Это означает, что порядок сохраняется.

dataColumns = serializers.ListField(
    child=serializers.MultipleChoiceField(
        choices=allowed_choices,
        allow_blank=False),
    source="data_Columns"
)
Другие вопросы по тегам