我有一个关于验证逻辑的问题serializers.ChoiceField
。正如我在代码中看到的,to_internal_value()
这ChoiceField
是用于验证客户端输入的代码:
def to_internal_value(self, data):
if data == '' and self.allow_blank:
return ''
try:
return self.choice_strings_to_values[six.text_type(data)]
except KeyError:
self.fail('invalid_choice', input=data)
这是我对 Django 模型的声明:
class MyModel(BaseModel, ScopedModelMixin):
my_field = models.FloatField(choices=MY_FLOAT_CHOICES, default=MY_FLOAT_CHOICES.default_value)
这是我的选择对象声明django-model-utils==2.6.1
:
from model_utils import Choices
MY_FLOAT_CHOICES = Choices(
(1.0, 'choice1', 'Choice1'),
(1.5, 'default_value', 'Choice2'),
(2.0, 'choice3', 'Choice3')
)
因此,模型序列化程序中生成的字段是serializers.ChoiceField
在先前声明的模型级别提供的选项。
在验证来自客户端的用户输入时,DRF 无法正确验证浮点值。例如,当我发送:
{
"myField": 1
}
它抛出"\"1\" is not a valid choice."
。所以当我带着调试器来的时候
return self.choice_strings_to_values[six.text_type(data)]
从之前显示to_internal()
的 中ChoiceField
,我看到它确实试图'1'
在选择列表中查找。当我更新我的选择时:
MY_FLOAT_CHOICES = Choices(
(1, 'choice1', 'Choice1'),
(1.5, 'default_value', 'Choice2'),
(2, 'choice3', 'Choice3')
)
它并没有失败,但是我在发送时遇到了同样的问题,1.0
并且1
它一圈又一圈。我应该在 DRF 存储库上提出问题,还是有更好的选择?