我有一个有效选择的预定义列表:
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"]
。但是输入是相反的。我的目标是保留此顺序。实际上,有效的选择是一个更大的领域,我无法(希望)用户强制执行我的订单。
答案 0 :(得分:0)
我找到了解决问题的方法。如果我将ListField
与孩子ChoiceField
一起使用,则to_internal_value
返回list
而不是集合(在MultipleChoiceField
中)。这意味着订单被保留。
dataColumns = serializers.ListField(
child=serializers.MultipleChoiceField(
choices=allowed_choices,
allow_blank=False),
source="data_Columns"
)