【问题标题】:What should be the default value for a not Null Unique field非空唯一字段的默认值应该是什么
【发布时间】:2016-01-04 22:27:05
【问题描述】:

我正在向现有模型添加一个字段:

...
booking_id = models.CharField(null=False, unique=True, max_length=5)
...

现在当我运行./manage makemigrations 时,请求一个默认值。该值是在pre_save 信号中创建的。在这种情况下我应该给出什么作为默认值?

显然,如果我给出一个默认值,当我运行 ./manage migrate 时,这会引发 django.db.utils.IntegrityError

【问题讨论】:

  • 有没有办法可以在可调用对象中完成您在 pre_save 中所做的事情?
  • 如果我不使用 pre_save 我需要查询 db。

标签: django django-models django-migrations


【解决方案1】:

使用null=True 添加字段,并创建迁移。然后添加数据迁移以填充该字段。最后,设置null=False 并创建最终迁移以添加NOT NULL 约束。

【讨论】:

  • 我一直讨厌 ORM 的这个特性。尤其是当它需要一个空表时......
  • @Beltiras 对于一个空表,你不能设置null=True 然后指定你想要的任何东西作为默认值。由于没有任何行,因此不会破坏唯一约束。
  • @Gocht 除非您可以将计算 id 的代码从 pre_save 移动到可调用对象,否则我不知道有更简单的方法。这不是太棘手。可能有几个步骤,但每一步都是直截了当的。
  • @Alasdair 我一直在处理这个流程。今天,我再次面临这种情况,但我想:“我会要求一种不同/更好的方法来做到这一点”,但似乎还没有。
  • 我不记得在迁移架构时不必做一些体操。这包括很多时候我在做原始建模,不需要考虑早期的数据。在迁移命令中添加一个表示硬重置的选项会很有用(它甚至可能存在,我在进行本地迁移之前使用的是南)。
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多