我已经设置了一个模型,其中两个Charfield设置为空白= True而不是null,根据两个scoops书籍建议(第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)
但是当我尝试将一个没有的模型条目保存到supplier_name字段时,我收到一个错误: django.db.utils.IntegrityError:列" supplier_name"中的空值违反非空约束。 处理这个问题的最佳方法是什么?我应该在字段声明中使用null = True还是将None转换为空字符串(不理想)?还是另一种方法?
答案 0 :(得分:2)
如果您没有指定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
转换为''
。
两个Scoops和Django文档推荐null=False
的原因是''
是唯一的数据'没有数据'。如果您有null=True
,那么“没有数据',''
和None
就有两个值。
使用null=True
的一个很好的理由是,如果您想使字段唯一,但允许空值。
在您的情况下,很难说您应该做什么,因为您还没有显示代码。理想情况下,保持null=True
坚持Django约定。然后,您可以修改代码,以便不设置supplier_name=None
,或将其转换为supplier_name = supplier_name or ''
。
答案 1 :(得分:0)
如果您将该字段保留为null,那么使用null=True
使用null = true的另一个优点是,如果您需要在同一模型中添加其他字段,则每次需要时都不会获取将来的更新错误告诉default
值,所以最好使用null = true来避免它。
答案 2 :(得分:0)
如果您不想使用空值,请为该字段提供默认值:
supplier_name = models.CharField(max_length=255, default='', blank=True)
https://docs.djangoproject.com/en/3.0/ref/models/fields/#default