【发布时间】:2017-09-26 13:21:14
【问题描述】:
我是 Django 新手。
IntegrityError: (1364, "Field 'created_at' doesn't have a default value")
当我没有为我在 models.py 中定义的模型写 created_at 时发生。
每次遇到这样的错误,我都会补充
created_at = models.DateTimeField(default=timezone.now, null=True)
到 models.py 然后运行 python manage.py makemigrations; python manage.py migrate --fake。
这样好吗? (我的意思是,它是否遵循 Django 最佳实践?)
当我使用 Rails 时,我从未遇到过这样的问题。为什么 Django 不自动处理created_at 列?
另外,我想知道为什么--fake 选项会消除此错误。
版本
Django==1.11.5
mysqlclient==1.3.12
Python 3.6.1
提前致谢。
【问题讨论】:
-
最佳做法是在每次更改
models.py后运行python manage.py makemigrations app_label和python manage.py migrate app_label。选项--fake将迁移标记为已完成,而无需实际执行 SQL 代码来更改数据库架构。 -
@cezar 谢谢,你对
--fake的解释很容易理解。如果我在每次更改后运行迁移命令,"Field 'created_at' doesn't have a default value"不会发生? -
从这里很难说这个问题是如何潜入你的代码的。您是否创建了一个模型类,然后将字段
created_at添加到其中? -
@cezar 是的,因为习惯了Rails风格,第一次忘记定义
created_at列,迁移后添加了这个clumn。