Как сохранить порядок в сериализации JSON через MultipleChoiceField - PullRequest
0 голосов
/ 27 января 2019

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

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 Ответ

0 голосов
/ 28 января 2019

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

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