【发布时间】:2011-10-30 00:11:57
【问题描述】:
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 很生气。
谢谢!
【问题讨论】:
标签: django