我遇到问题,即使序列化中提供的数据不完整,我的serializer.is_valid()方法也会返回true。我有一个看起来像这样的简单模型:
class Dummy(models.Model):
first_name = models.TextField(max_length=128)
last_name = models.TextField(max_length=128)
organization = models.TextField(max_length=128)
email = models.EmailField()
can_contact = models.BooleanField()
我为其创建了以下序列化程序:
class DummySerializer(serializers.ModelSerializer):
class Meta:
model = Dummy
fields = ('first_name', 'last_name', 'organization', 'email',
'can_contact',)
如果我然后运行此测试(请注意输入序列化中缺少can_contact
):
>>> serializer = DummySerializer(data = {'first_name': 'foo', 'last_name': 'bar', 'organization': 'quux inc', 'email': 'foo@example.com'})
>>> serializer.is_valid()
True
如果我尝试保存序列化程序,我会遇到约束失败:
django.db.utils.IntegrityError: NOT NULL constraint failed: demo_dummy.can_contact
它似乎特别是BooleanField;任何其他字段都将被正确识别为缺失。序列化程序出了什么问题,我该怎么做才能做我自己的手动输入验证?
谢谢你的时间!
答案 0 :(得分:0)
不确定为什么它以这种方式工作,我知道你想避免手动输入验证,但这是一个解决方法:
根据您拥有的django rest框架的版本,将以下内容添加到序列化程序中:
DRF v2:
def validate_can_contact(self, attrs, source):
if source in attrs:
return attrs
else:
raise serializers.ValidationError("Field Missing")
DRF v3:
def validate_can_contact(self, value):
if 'can_contact' in value:
return value
else:
raise serializers.ValidationError("Field Missing")
答案 1 :(得分:0)
来自Django Boolean Field Docs:
The default value of BooleanField is None when Field.default isn’t defined.
给出的错误是:
django.db.utils.IntegrityError: NOT NULL constraint failed: demo_dummy.can_contact
DRF模型序列化程序正在映射Django Model中的字段/属性。 所以我认为你必须要为布尔字段声明一些默认值True或False 要么 如果要接受Null值,则将Boolean字段更改为NullBooleanField