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 空错误的主要内容,如果未能解决你的问题,请参考以下文章
跟进:缺少 django Modelform 中所需的 Charfield 被保存为空字符串并且不会引发错误