【问题标题】:Django: When will `auto_now` field not be updated?Django:“auto_now”字段什么时候不会更新?
【发布时间】:2021-12-23 06:28:44
【问题描述】:

假设我有一个由 Postgres 支持的 Django 应用程序,并且在该应用程序中我有一个名为 Contact 的模型和一个名为 DateTimeField 的模型 last_updated。假设last_updatedauto_now 设置为True

我知道在某些情况下 last_updated 不会在更新 Contact 记录时得到更新:

  • Contact.objects.filter(xxx).update(yyy) 不会更新 last_updated,除非 last_updated 包含在 yyy
  • Contact.objects.bulk_update(contacts_qs, [zzz]) 不会更新 last_updated 除非 last_updatedzzz

是否有其他方法可以更新修改Contact 对象(禁止直接访问数据库)其中last_updated 不会被更新?

【问题讨论】:

  • mymodelobject.save(update_fields=['no_yyy'])

标签: django postgresql django-models


【解决方案1】:

来自文档auto_now

DateField.auto_now

每次保存对象时自动将字段设置为现在。对于“最后修改”的时间戳很有用。请注意,始终使用当前日期;它不仅仅是一个可以覆盖的默认值。

该字段仅在调用 Model.save() 时自动更新。以其他方式(例如 QuerySet.update())对其他字段进行更新时,该字段不会更新,但您可以在这样的更新中为该字段指定自定义值。

因此,除非您直接从模型中进行未修改的保存,否则该字段可能不会自动保存。这就是我使用 Postgres 触发器/函数组合在数据库中处理此问题的原因。还可以处理来自 Django 外部的数据更新。

【讨论】:

  • 感谢您的意见。我对 Postgres 触发器和函数不是很流利,这是一个很好的 SO 问题,可以从以下开始:stackoverflow.com/questions/1035980/…
  • 是的,我基本上就是这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2012-01-12
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多