Charfield 空错误

Posted

技术标签:

【中文标题】Charfield 空错误【英文标题】:Charfield null errors 【发布时间】:2016-05-09 10:36:34 【问题描述】:

我已经设置了一个模型,其中几个 Charfield 设置为 blank=True 而不是 null 根据两个勺书建议(第 6.2.4 节)。

class Supplier(models.Model):
    unique_id = models.IntegerField(unique=True)
    name = models.CharField(max_length=255, unique=True)
    supplier_name = models.CharField(max_length=255, blank=True)

但是,当我尝试将具有 None 的模型条目保存到供应商名称字段时,我收到错误: django.db.utils.IntegrityError:“供应商名称”列中的空值违反了非空约束。 处理这个问题的最佳方法是什么?我应该在字段声明中使用 null=True 还是将 None 转换为空字符串(不理想)?还是其他方法?

【问题讨论】:

您是如何创建Supplier 实例的?如果您不指定supplier_name,例如Supplier.objects.create(unique_id=1, name='example'),那么我希望 supplier_name 被保存为一个空字符串。但是,如果您明确设置supplier_name=None,例如Supplier.objects.create(unique_id=2, name='example2', supplier_name=None),然后 Django 将尝试保存 null,您将获得 IntegrityError。请注意,blank=True 选项会影响 Django 管理员和模型表单——它不会影响底层数据库架构,或自动将 None 转换为 '' 谢谢,这就是问题所在。我以为 django 确实自动将 None 转换为 '' 我一直在尝试使用 supplier_name=None 保存 很高兴它有帮助,我已添加评论作为答案。 【参考方案1】:

如果您不指定 supplier_name,例如Supplier.objects.create(unique_id=1, name='example'),那么我希望 supplier_name 被保存为一个空字符串。

但是,如果您明确设置supplier_name=None,例如 Supplier.objects.create(unique_id=2, name='example2', supplier_name=None),然后 Django 会尝试保存 null,你会得到 IntegrityError

请注意,blank=True 选项会影响模型表单和 Django 管理员。它不会影响底层数据库架构,也不会自动将None 转换为''

Two Scoops 和 Django Docs 推荐 null=False 的原因是 '' 是“无数据”的唯一值。如果您有null=True,那么“无数据”有两个值,''None

使用null=True 的一个很好的理由是,如果您想使字段唯一,但允许空值。

在您的情况下,很难说您应该做什么,因为您没有显示代码。理想情况下,保留null=True 以遵守 Django 约定。然后,您可以修改您的代码,以便不设置 supplier_name=None,或将其转换为 supplier_name = supplier_name or ''

【讨论】:

【参考方案2】:

如果您可以将该字段保留为 null 则使用 null=True 使用 null=true 的另一个优点,当您在同一模型中添加其他文件时,您将不会获取未来更新错误,然后每次您需要告知default 值所以最好使用 null=true 来避免它。

【讨论】:

【参考方案3】:

如果您不想要空值,请为该字段提供默认值:

supplier_name = models.CharField(max_length=255, default='', blank=True)

https://docs.djangoproject.com/en/3.0/ref/models/fields/#default

【讨论】:

以上是关于Charfield 空错误的主要内容,如果未能解决你的问题,请参考以下文章

charfield 的自定义验证器不会引发任何错误

跟进:缺少 django Modelform 中所需的 Charfield 被保存为空字符串并且不会引发错误

Django 表单模板错误

姜戈。登录表单的错误消息

django.db.utils.IntegrityError:列“venue_city”包含空值

带有日文名称的文件引发错误