所以在我第一次迁移之后的一段时间里,我决定要包含这些字段:
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
进入我的模型之一。当我
makemigrations
它给了我You are trying to add a non-nullable field 'created' to episode without a default; we can't do that (the database needs
something to populate existing rows).
所以我然后把它改成
created = models.DateTimeField(auto_now_add=True, default=datetime.now)
尝试后
makemigrations
再次,它说at_api.Episode.modified: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one
of these options may be present.
好的,所以我继续删除了 auto_now_add
created = models.DateTimeField(default=datetime.now)
我现在可以
makemigrations
没有任何问题。然后我后来删除了 default=datetime.now
并将其替换为 auto_now_add=True
,并再次迁移,没有任何问题。但是,我不禁感到这可能不是最好的做事方式。我觉得项目后期可能会出错。
最佳答案
我认为这里的最佳实践是使字段可以为空。你的什么created
字段此时的意思是:“创建实例的时间,或者我运行迁移的任意时间。”表示缺少值的标准方法是 NULL
,而不是任意值。
也就是说,如果你确实想使用一些任意值,你只需要告诉 Django 它是什么。通常 makemigrations
为您提供指示用于现有行的一次性值的选项 - 没有发生吗?
更费力的方法是将字段声明为可为空,然后创建数据迁移以填充所需的值,然后使其不可为空。你所做的基本上是一个简化版本。除了 created
的问题之外,我认为它不会造成任何问题。并不是创建实例的时间。
关于Django 1.8 迁移。在创建数据库后添加 DateTimeField。最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31498842/