Django DateTimeField auto_now_add 不起作用
Posted
技术标签:
【中文标题】Django DateTimeField auto_now_add 不起作用【英文标题】:Django DateTimeField auto_now_add not working 【发布时间】:2011-08-19 11:35:35 【问题描述】:在其中一个模型中,我设置了一个时间戳字段,如下所示:
created_datetime = models.DateTimeField(auto_now_add = True)
虽然在 shell 中我可以创建一个 obj 并保存它,但是在我的应用程序中它引发了一个异常,即 created_datetime 字段不能为空。
很困惑哪里出了问题!!如何重新爱上它。
【问题讨论】:
最好使用自定义的save()
,而不是使用auto_now_add
。 Read this.
【参考方案1】:
据我所知,默认日期时间的最佳做法是使用以下内容:
created_datetime = models.DateTimeField(default=datetime.datetime.now)
别忘了导入日期时间
【讨论】:
auto_now
是否有类似的方法,还是可以按原样使用?
我相信auto_now
的最佳实践是覆盖save()
并手动设置日期时间。
截至 2018 年,此信息已过时。根据 django 的最佳实践是使用 auto_now=True。
我不得不使用initial=
而不是default=
【参考方案2】:
我有这个,它真的让我很困惑。
原来我的模型有一个自定义主键,这是由于在构建一些测试对象时没有设置它的错误。
这在auto_now_add
设置created_at
时第一次运行良好。第二次它没有作为具有空主键的对象已经存在,所以它正在进行更新。它试图将其设置为 created_at
null,这在我的模型中是不允许的。
因此值得检查您是否以错误“在我的应用程序中引发了 created_datetime 字段不能为空的异常”结束这个问题,这可能是由于未正确设置主键造成的。
解决方案是让我正确设置主键。
【讨论】:
非常感谢您的评论,它帮助了我。我的情况是我正在重用主键来创建新记录,而 django/sqlite 出于某种原因没有说“你不能重用该键”,而是抱怨 created_at 字段。您在这里的提示确实为我节省了很多时间。【参考方案3】:你可以这样做
created_datetime = models.DateTimeField(auto_now_add=True, auto_now=False)
【讨论】:
我不明白 - 这如何以及为什么有帮助?【参考方案4】:以下方式在django文档的“part1”中
from django.utils import timezone
p = Poll(question="What's new?", pub_date=timezone.now())
【讨论】:
以上是关于Django DateTimeField auto_now_add 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
django DateTimeField和DateField和TimeField
django queryset filter datetimefield