Django 1.8 迁移。在创建数据库后添加 DateTimeField。最佳实践?

标签 django datetime django-models django-migrations

所以在我第一次迁移之后的一段时间里,我决定要包含这些字段:

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/

相关文章:

python - Django 查询集缓存与exists() 和values_list()

python - Django 将 urls.py 拆分为子模块

python - 服务器上导入错误,但在本地计算机上工作正常

mysql - 我可以将具有无效微秒值的 mysql 字段转换为日期时间格式吗?

MySQL 根据日期从多个表中获取结果

Django模型创建使用__init__?

python - Django 加载对象以防唯一键重复

python - 使用 django 和 AngularJS 使用 JWT 登录所需的装饰器

java - 代码审查 : java Dates diff (in day resolution)

python - 如何将多个 Django 模型收集到一个列表中?