所以有的时候一对夫妇迁移后,我的第一次,我决定我要包括以下字段:Django 1.8迁移。创建数据库后添加DateTimeField。最佳实践?
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
替换它,然后再次迁移,没有任何问题。然而,我不禁觉得这可能不是做事的最佳方式。我觉得项目后期可能会出现问题。
是的,django的确问我现有行的一次性价值。我试过'datetime.now',但它似乎没有工作。但是我认为一切都很好呢?对于现有的行值,将“null = True”设置为“占位符”是否典型,然后稍后将其删除以替换其他值? – pyramidface
'datetime.now()'本来有效(注意圆括号 - 你想调用函数并使用它的返回值)。在需要为不同行分配不同值的更复杂情况下,您可以添加和删除'null = True'。例如,假设您将实际创建日期存储在某个文件中。你会写一个数据迁移,为每一行查找文件中的日期,然后将其放入数据库中。之后,您可以删除'null = True'并再次迁移。 –
啊,好吧,我会在未来的项目中记住这一点。谢谢!! – pyramidface