所以在我第一次迁移之后的一段时间,我决定要包括这些字段:
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.10。我读了Kevin的答案,当Django要求我将其填充为datetime.now
字符串时,我试图将默认值设置为默认值。我很惊讶,因为对于这些字段,Django会自动问你是否要使用datetime.now
作为默认值:
$ ./manage.py makemigrations
You are trying to add the field 'date_created' with 'auto_now_add=True' to projectasset without a default; the database needs something to populate existing rows.
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value.
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
[default: timezone.now] >>>
所以,我只是确认,一切似乎都很好!