Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ORM、CharField和blank=True_Django - Fatal编程技术网

Django ORM、CharField和blank=True

Django ORM、CharField和blank=True,django,Django,Django的文档非常清楚在数据库级别将空字符串存储为“”而不是NULL(因此空数据只有一种可能的格式): 请注意,空字符串值将始终存储为空字符串,而不是NULL。仅对非字符串字段(如整数、布尔值和日期)使用null=True。对于这两种类型的字段,如果希望在表单中允许空值,还需要将blank=True,因为null参数只影响数据库存储(请参见blank) 尽管如此,在添加一个新字段后,我开始在新字段(电话号码)上遇到IntegrityErrors “电话号码”列中的null值违反非null约束

Django的文档非常清楚在数据库级别将空字符串存储为“”而不是NULL(因此空数据只有一种可能的格式):

请注意,空字符串值将始终存储为空字符串,而不是NULL。仅对非字符串字段(如整数、布尔值和日期)使用null=True。对于这两种类型的字段,如果希望在表单中允许空值,还需要将blank=True,因为null参数只影响数据库存储(请参见blank)

尽管如此,在添加一个新字段后,我开始在新字段(电话号码)上遇到IntegrityErrors

“电话号码”列中的null值违反非null约束

该模型与新字段类似(我通过south执行了迁移):

我(暂时)通过在phone_number上设置null=True解决了这个问题,但现在我有数百个空字符串条目,数据库中只有一个null值。(我还尝试将default=''添加到phone_number字段,但仍然看到IntegrityError问题。)

在过去我一直使用MySQL,但在这个项目上我使用的是Postgres。生成的SQL插入尝试为:

“将值(%s、%s、%s、%s、%s、%s、%s、%s、%s)插入“人物”(“用户id”、“说明”、“性别”、“出生日期”、“默认图像id”、“邮政编码”、“beta状态”)并返回“人物”。.id”

我的期望是Django会在“phone_number”列中插入一个空白字符串,但它似乎没有这样做。我可能期望的另一件事是Django在CREATETABLE语句中包含一个SET DEFAULT,但事实并非如此。因此,Postgres对该列上的NOTNULL表示愤怒


谢谢

与通常情况下看似棘手的问题一样,当前的问题是用户错误

我的应用程序有两个入口点——两个WSGI文件,但只有一个代码库。通常,Apache只会在触及文件时重新加载代码。我的部署脚本只涉及其中一个WSGI文件,这意味着通过另一个WSGI文件访问我的站点的人仍然看到旧代码。更糟糕的是,在旧代码下修改了数据库,但模型仍然与以前一样

这反过来又导致了
完整性错误
问题。Django不知道
phone\u number
字段,所以即使我设置了
blank=True
,Django也没有尝试插入一个空白值,数据库当然认为这意味着NULL

这导致了一系列不同的错误跟踪,包括上述错误

令人惊讶的是,像这样真正棘手的问题往往是由愚蠢的小疏忽造成的——比如我在2个月前编写的部署脚本,但忘记了更新


感谢大家的阅读,我已经对其他答案投了更高的票,但我需要接受我的答案,因为它最终是解决方案。

我发现,如果您将字段值显式设置为
None
,您仍然会收到这些错误。换句话说,
default=
东西在创建python对象时应用,而不是在将其保存到数据库时应用


我想这是合理的,但有点出乎意料。

如果将
None
传递给构造函数,同样的事情似乎也会发生(因此,在创建时)
class Person(models.Model):
    user = models.ForeignKey(User)
    description = models.TextField(blank=True)
    phone_number = models.CharField(blank=True)