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格式

django DateTimeField和DateField和TimeField

django queryset filter datetimefield

django:DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用

django-20.添加创建时间DateTimeField

python测试开发django-20.添加创建时间DateTimeField