Django的文档非常清楚在数据库级别将空字符串存储为“”而不是NULL(因此空数据只有一种可能的格式):
请注意,空字符串值将始终存储为空字符串,而不是NULL。仅对非字符串字段(如整数,布尔值和日期)使用null = True。对于这两种类型的字段,如果要在表单中允许空值,则还需要设置blank = True,因为null参数仅影响数据库存储(请参阅空白)。
尽管如此,在添加新字段后,我开始在新字段(phone_number)上遇到IntegrityErrors。
“phone_number”列中的空值违反非空约束
新模型看起来像这样(我通过南方进行了迁移):
class Person(models.Model):
user = models.ForeignKey(User)
description = models.TextField(blank=True)
phone_number = models.CharField(blank=True)
我已经(暂时)通过在phone_number上设置null = True解决了这个问题,但是现在我有数百个带空字符串的条目,并且我的数据库中有一个NULL值。 (我也尝试将default =''添加到phone_number字段,但我仍然看到了IntegrityError问题。)
在过去,我一直使用MySQL,但在这个项目中,我使用的是Postgres。生成的SQL插入尝试是:
'INSERT INTO "people_person" ("user_id", "description", "gender", "birthdate", "default_image_id", "zip_code", "beta_status") VALUES (%s, %s, %s, %s, %s, %s, %s) RETURNING "people_person"."id"'
。
我的期望是Django会在“phone_number”列中插入一个空字符串,但它似乎没有这样做。我可能期望的另一件事是Django在CREATE TABLE语句中包含SET DEFAULT,但事实并非如此。因此Postgres对该列上的NOT NULL感到愤怒。
谢谢!