Django serializer is_valid()错误地返回True

Django serializer is_valid()错误地返回True,django,serialization,Django,Serialization,我遇到一个问题,我的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)

我遇到一个问题,我的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\u contact
):

如果尝试保存序列化程序,则会出现约束失败:

django.db.utils.IntegrityError: NOT NULL constraint failed: demo_dummy.can_contact
它似乎特别是布尔领域;任何其他字段都将被正确识别为丢失。序列化程序出了什么问题,除了自己手动输入验证之外,我该怎么做


谢谢你的时间

不知道为什么会这样,我知道您希望避免手动输入验证,但这是一个解决方法:

根据您拥有的django rest framework版本,向序列化程序添加以下内容:

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")
来自Django:

给出的错误是:

  django.db.utils.IntegrityError: NOT NULL constraint failed: demo_dummy.can_contact
DRF模型序列化程序正在从Django模型映射字段/属性。 所以我认为您必须为布尔字段声明一些默认值,要么为True,要么为False 或
如果要接受空值,请将布尔字段更改为NullBooleanField

谢谢您的建议;我试过了,但两个版本的方法都没有被调用。我可以为其他字段类型创建自定义验证器,例如,
validate\u first\u name
将被调用(它使用v3调用约定)。但是,
validate\u can\u contact
未被调用。有趣的是……我尝试将
blank=False
添加到模型规范中(因此
can\u contact=BooleanField(blank=False)
,然后调用验证器,但是
参数是
False
。对于缺少的字段,它不应该是
None
吗?将其更改为NullBooleanField可以使
save
方法正常工作,但当字段缺少时,它仍然无法投诉。我希望
有效()
如果
can\u contact
不在表单数据中,则返回false。
  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