auto_now设置了属性的任何字段都将继承
editable=False,因此不会显示在管理面板中。过去有过关于使
auto_nowand auto_now_add参数消失的讨论,尽管它们仍然存在,但我认为你最好只使用自定义save()方法。
因此,为了使其正常工作,我建议不要使用
auto_now或
auto_now_add而是定义自己的
save()方法以确保
created仅在
id未设置的情况下(例如,首次创建该项目时)才对其进行更新,并使其在
modified每次该项目时都进行更新已保存。
我已经使用Django编写的其他项目完成了完全相同的操作,因此你
save()将如下所示:
from django.utils import timezoneclass User(models.Model): created = models.DateTimeField(editable=False) modified = models.DateTimeField() def save(self, *args, **kwargs): ''' On save, update timestamps ''' if not self.id: self.created = timezone.now() self.modified = timezone.now() return super(User, self).save(*args, **kwargs)
希望这可以帮助!
编辑以回应评论:
我坚持重载
save()与依赖这些字段参数的原因有两个:
- 前述的起伏与它们的可靠性有关。这些参数在很大程度上取决于Django知道如何与之交互的每种类型的数据库对待日期/时间戳字段的方式,并且似乎在每个发行版之间都会中断和/或更改。(我相信这是完全删除它们的呼吁的推动力)。
- 它们仅在
DateField,DateTimeField
和TimeField
上起作用,使用这种技术,你可以在每次保存项目时自动填充任何字段类型。 - 使用
django.utils.timezone.now()vs. datetime.datetime.now()
,因为它会根据来返回TZ感知或天真的datetime.datetime
对象settings.USE_TZ
。
为了解决OP为何会看到错误的原因,我不知道确切的信息,但是created尽管有,但看起来根本没有被填充auto_now_add=True
。对我来说,它是一个bug
,并且在我上面的小列表中强调了项目#1:auto_now
并且auto_now_add
充其量是片状的。



