Как сохранить порядок в сериализации 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"
)