gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:08:19 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com