【问题标题】:Django ArrayField null=True migration with PostgresqlDjango ArrayField null=使用 Postgresql 进行真正的迁移
【发布时间】:2016-08-05 15:44:07
【问题描述】:

所以在 Django 文档中用于在 Postgresql 上创建新字段时说 (Full description):

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

如果我想创建一个 ArrayField,如下所示:

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

我是否也应该将null=True 传递到CharField 中,这在ArrayField 中?

【问题讨论】:

  • 从阅读 docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/… 开始,在我看来,您只需要将实际的 ArrayField 设为可空,因为 base_field 仅用于类型、验证等。
  • 请注意,如果您设置了null=True,您可能还需要设置blank=True。否则在清理模型表单时会出错。

标签: python django postgresql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您添加 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     | 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 2018-09-18
      • 2014-10-16
      • 2012-04-11
      • 1970-01-01
      相关资源
      最近更新 更多