Django ModelSerializer中的DRF BooleanField导致IntegrityError

Django ModelSerializer中的DRF BooleanField导致IntegrityError,django,django-rest-framework,Django,Django Rest Framework,我的ModelSerializer有问题 class Recall(models.Model): thermal_step = models.BooleanField() have_inventory = models.BooleanField() have_adverse = models.BooleanField() class OrderRecallSerializer(serializers.ModelSerializer): class Meta:

我的ModelSerializer有问题

class Recall(models.Model):
    thermal_step = models.BooleanField()
    have_inventory = models.BooleanField()
    have_adverse = models.BooleanField()


class OrderRecallSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recall
        fields = ['thermal_step', 'have_inventory', 'have_adverse']

s = OrderRecallSerializer(data={})
s.is_valid()
>>> True
s.save()
>>> django.db.utils.IntegrityError: null value in column 
"thermal_step" violates not-null constraint
在django中,BooleanField始终设置为blank=True,因为浏览器不会在POST数据中发送未选中的复选框

在这种情况下,ModelForm将模型字段设置为False。当使用DRF ModelSerializer时,生成的BooleanField被创建为required=False,当字段不在数据中时,传递给serializer,model field被设置为None,并在保存模型时引发IntegrityError

我应该在ModelSerializer中显式指定BooleanField(默认值=False),还是缺少什么?我希望ModelSerializer的行为类似于ModelForm——当它不存在时,将值设置为False,这等于自动生成默认值为False的BooleanField

我认为获得默认行为的IntegrityError不是预期的,也许我应该提交一个bug

当您使用它时,通常需要检查值是否为True,所以我认为最佳实践总是为它设置
默认值。并在models类中设置,例如在您的案例中:

class Recall(models.Model):
    thermal_step = models.BooleanField(default=False)
    have_inventory = models.BooleanField(default=False)
    have_adverse = models.BooleanField(default=True)

这是Django Rest Framework旧版本中的一个bug,但似乎在不久前就解决了,可能您需要在序列化程序中明确要求它,如:

class OrderRecallSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recall
        fields = ['thermal_step', 'have_inventory', 'have_adverse']
        extra_kwargs = {
          'thermal_step': {'required': True, 'allow_null': False},
          'have_inventory': {'required': True, 'allow_null': False},
          'have_adverse': {'required': True, 'allow_null': False},
        }

或者@bear brown所说的通常是最佳实践。

使用
models.NullBooleanField()
models.BooleanField(required=False,null=True,default=False)
@alfonso.kim我不需要存储空值,我认为为BooleanField指定null=True是错误的想法。此外,models.BooleanField的参数也是错误的。也许最好的答案是始终为BooleanField设置default=False。。。