null=True, blank=True 但在提交时仍然会引发错误:may not be null。

3

我的模型:

    Assets(modes.Model):
      assset_code=models.CharField(max_length=12,null=True,blank=True)

在我的serializers.py文件中:

 asset_code=serializers.CharField(max_length=12,allow_blank=True,required=False)

当我提交数据时,它仍然显示此字段不能为空。只有在我输入数据后,它才允许我通过。
顺便问一下,在序列化程序中使JSONField()变为可选的正确方法是什么?

是 Django 还是 Django REST 框架? - Emmanuel Mtali
分享您的错误追踪信息会很有帮助。 - misraX
@EmmanuelMtali:是的,它是DRF。 - Nie Selam
@misraX,没有错误回溯...只有{"detail": "此字段不能为空"}。如果输入数据,就没有问题。 - Nie Selam
1个回答

1
在字符串字段中避免使用null=True,如果需要设置null=True,仅在下面的异常情况下才需要,并且有关null的更多信息,请查看Django 文档

Django文档

一个例外是当CharField同时具有unique=True和blank=True设置时。在这种情况下,需要null=True以避免保存具有空值的多个对象时出现唯一性约束冲突。

对于django模型和表单,blank=True(DRF)的设置足以让django表单、django管理界面和Django REST框架了解到该字段不是必需的,并且该字段的值将作为空字符串保存在您的数据库中。
对于Django REST框架中的null,避免使用allow_null=True,请查看DRF文档Django REST框架文档

不建议使用它,而应该选择allow_blank。将allow_blank=True和allow_null=True都设置为有效,但这样做意味着将有两种不同类型的空值可用于字符串表示,这可能导致数据不一致和微妙的应用程序错误。

因此,对于您的asset_code参数和任何遵循相同情况的未来字符串字段,对于Django模型,blank=True已足够,而对于DRF,allow_blank=True已足够。

# models.py
assset_code = models.CharField(max_length=12, blank=True)

# serializer.py
assset_code = serializers.CharField(max_length=12, allow_blank=True)

1
那有什么帮助呢?问题是rest_framework.exceptions.ValidationError: {'container_field': [ErrorDetail(string='This field may not be null.', code='null')]},尽管已经设置了'allow_null': True, 'allow_blank': True,而且明显也设置了模型。实际上,如果我不发送任何东西,我的数据库将把它设置为NULL,因为它是遗留数据库,并且我将命令设置为DEFAULT NULL。 - Mehdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接