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

Python Django ArrayField null=使用Postgresql进行的真正迁移,python,django,postgresql,Python,Django,Postgresql,因此,在Django文档中,在Postgresql上创建新字段时,它说(): 。。。建议您始终使用null=True创建新列,因为这样会立即添加这些列 如果我想创建一个ArrayField,比如: tags = ArrayField(models.CharField(max_length=255, blank=True, default=''), default=list, null=True) 我是否也应该将null=True传递到CharField中,该字段位于ArrayField中?我认

因此,在Django文档中,在Postgresql上创建新字段时,它说():

。。。建议您始终使用
null=True
创建新列,因为这样会立即添加这些列

如果我想创建一个ArrayField,比如:

tags = ArrayField(models.CharField(max_length=255, blank=True, default=''), default=list, null=True)

我是否也应该将
null=True
传递到
CharField
中,该字段位于
ArrayField
中?

我认为在内部类型上设置
null=True
不会给您带来任何好处。您提到的文档中的注释仅适用于列本身,因此只要
ArrayField
可为空,数据库就不必执行完整的表重写


如果您允许内部类型为null,那么您必须在代码中处理它,这可能不是您想要的。

如果您添加null=True只是因为文档中说:

。。。建议您始终使用
null=True
创建新列,因为这样会立即添加这些列

我认为在
数组字段中没有必要这样做。因为您已经在字段中添加了默认值。所以数据库中已经存在的任何条目都将具有此默认值(在本例中为空列表)

添加
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     | 

从阅读中,我觉得您只需要将实际的
ArrayField
设置为null,因为base\u字段仅用于类型、验证等。请注意,如果设置
null=True
,您可能还需要设置
blank=True
。否则,在清理模型表单时将出现错误。