django rest framework Serializer验证字段数据类型

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!为什么这个 !!

感谢帮助

Ale*_*voy 6

您的问题的答案是类型转换.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)