我是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
先谢谢你了。
3条答案
按热度按时间dgiusagp1#
似乎您希望在每次创建模型示例时设置一个属性
created_at
。有一个更简单的方法:这里有详细解释的文档https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.DateField.auto_now_add
new9mtju2#
从你的评论中,我想我可以复制你的步骤。在
models.py
中有一个模型类:然后你跑了:
之后,你添加到你的模型类:
但忘记运行迁移并收到错误消息。
这是因为Django ORM正在寻找属性
created_at
,它在数据库中找不到。你必须运行命令:请记住,选项
--fake
不会更改DB。它只是将迁移标记为运行。只有当你确定你在做什么的时候才使用它。正如Johannes Reichard建议的那样,您最好使用
auto_now_add
(还有auto_now
)来实现此目的。查看官方文档。缺点是此字段不会显示在管理中。解决方法是覆盖save方法:
yrefmtwq3#
我也遇到过类似的问题,我的数据库状态与存储库不同步(可能是从另一个存储库分支迁移而来的一些剩余字段留在了数据库中)。
看到这个错误我就抓狂了:
IntegrityError: (1364, "Field 'open' doesn't have a default value")
当我没有字段
open
在我的模型。请确保检查您的DB模式并查找表定义,然后将其与Django模型定义进行比较。