所以在用于在Postgresql上创建新字段的Django文档中,它说(Full description):
...建议您始终使用
null=True
创建新列,这样就会立即添加。
如果我想创建一个ArrayField,如下所示:
tags = ArrayField(models.CharField(max_length=255, blank=True, default=''), default=list, null=True)
我是否也应将null=True
传递到此CharField
内的ArrayField
?
答案 0 :(得分:6)
我不认为在内部类型上设置null=True
会给你带来任何好处。您引用的文档中的注释仅适用于列本身,因此只要ArrayField
可以为空,数据库就不必执行完整的表重写。
如果你允许内部类型为null,那么你必须在你的代码中处理它,这可能不是你想要的。
答案 1 :(得分:1)
如果您要添加null = True仅是因为文档说:
......建议您始终使用
null=True
创建新列,这样可以立即将其添加。
在ArrayField
中,我认为这不是必需的。因为您已经向字段添加了默认值。因此,数据库中已经存在的任何条目都将具有此默认值(在这种情况下,该列表为空列表)。
null=True
以便在不指定默认值的情况下,可以将字段值设置为null,并且在迁移过程中无需手动输入默认值。
将来,如果您不打算在此字段中输入空值,则可以省略null=True
部分。
让我们说您有一个包含以下数据的表:
id | user_id
----+---------
1 | 66
2 | 105
3 | 110
4 | 174
添加default=list
并进行迁移后,您的数据将如下所示。请注意,在这种情况下,您无需指定null=True
。
id | user_id | tag
----+---------+-----
1 | 66 | {}
2 | 105 | {}
3 | 110 | {}
4 | 174 | {}
如果您未指定默认值并设置null=True
,则数据为:
id | user_id | tag
----+---------+-----
1 | 66 |
2 | 105 |
3 | 110 |
4 | 174 |