Django序列化程序is_valid()错误地返回True

时间:2016-03-25 20:38:29

标签: 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)
    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;任何其他字段都将被正确识别为缺失。序列化程序出了什么问题,我该怎么做才能做我自己的手动输入验证?

谢谢你的时间!

2 个答案:

答案 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