Charfield null错误

时间:2016-05-09 10:36:35

标签: python django django-models

我已经设置了一个模型,其中两个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转换为空字符串(不理想)?还是另一种方法?

3 个答案:

答案 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