我的问题是关于 django rest 框架序列化器,
我的序列化程序不检查字段类型!我想我想念一些东西
我用于测试的示例序列化程序
class TestSerializer(serializers.Serializer):
test_bool = serializers.BooleanField(required=True)
class Meta:
fields = ('test_bool',)
我用于测试序列化程序的示例代码
def test_my_test(self):
data = {'test_bool': 'bla'}
serializer = TestSerializer(data=data)
self.assertEquals(serializer.is_valid(), True)
serializer.is_valid() 必须为 false,因为 'test_bool' 的给定值不是 bool 值,但实际上 serializer.is_valid() 为 True !!!为什么会这样!!
感谢您的帮助
最佳答案
您的问题的答案是类型转换。 DRF 使用以下算法将值转换为 bool 值:
if value in ('true', 't', 'True', '1'):
return True
if value in ('false', 'f', 'False', '0'):
return False
return bool(value)
正如您在最后一行看到的,DRF 显式地将值转换为 bool 值。从外壳:
>>> bool('bla')
True
这就是为什么您的示例总是返回 True
。为了避免这种影响,您需要创建一个自定义字段并指定必要的转换规则。例如:
from rest_framework import serializers
class StrictBooleanField(serializers.BooleanField):
def from_native(self, value):
if value in ('true', 't', 'True', '1'):
return True
if value in ('false', 'f', 'False', '0'):
return False
return None
class TestSerializer(serializers.Serializer):
test_bool = StrictBooleanField(required=True)
class Meta:
fields = ('test_bool',)
...
# tests.py
class TestSerializerTestCase(unittest.TestCase):
def test_my_test(self):
data = {'test_bool': 'bla'}
serializer = TestSerializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertDictEqual(
{'test_bool': [u'This field is required.']}, serializer.errors
)
关于django rest框架序列化器验证字段数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26044376/