2 django types serializer django-rest-framework
我的问题是关于django rest框架序列化器,
我的序列化器不检查字段的类型!我想我想念一下
我的样本序列化器用于测试
class TestSerializer(serializers.Serializer):
test_bool = serializers.BooleanField(required=True)
class Meta:
fields = ('test_bool',)
Run Code Online (Sandbox Code Playgroud)
我的测试序列化程序的示例代码
def test_my_test(self):
data = {'test_bool': 'bla'}
serializer = TestSerializer(data=data)
self.assertEquals(serializer.is_valid(), True)
Run Code Online (Sandbox Code Playgroud)
serializer.is_valid()必须为false,因为'test_bool'的给定值不是boolean,但实际上serializer.is_valid()是True!为什么这个 !!
感谢帮助
您的问题的答案是类型转换.DRF使用以下算法将值转换为布尔值:
if value in ('true', 't', 'True', '1'):
return True
if value in ('false', 'f', 'False', '0'):
return False
return bool(value)
Run Code Online (Sandbox Code Playgroud)
正如您在最后一行看到的那样,DRF显式地将值转换为boolean.来自shell:
>>> bool('bla')
True
Run Code Online (Sandbox Code Playgroud)
这就是为什么你的例子总是返回的原因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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3026 次 |
| 最近记录: |