django rest框架序列化器验证字段数据类型

标签 django types django-rest-framework serialization

我的问题是关于 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/

相关文章:

c# - 多种类型的数组 C#(包括其他数组)

python - 如何将 csv 日期时间字符串保存到 Django 模型字段中

django - 如何使用 django 测试系统测试 EmailMultiAlternatives 对象中的替代正文内容?

django - 如何从 Django 中的请求对象获取 URI?

django - 如何验证 django 中的表单字段?

Java动态返回类型?

haskell - 编写具有通用量化返回类型的函数

django - 如何使用模型字段过滤 serializers.SlugRelatedField 查询集

django - 在 Django Rest Framework 中,@link 可以在没有 PK 的情况下路由吗?

django - 序列化器字段可能命名不正确,并且与 `GenericRelatedObjectManager` 实例上的任何属性或键都不匹配