Django ArrayField null =使用Postgresql进行真正的迁移

时间:2016-04-14 08:06:21

标签: python django postgresql

所以在用于在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

2 个答案:

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