【问题标题】:Is Django guaranteed to generate identical timestamps for auto_now and auto_now_add?Django 是否保证为 auto_now 和 auto_now_add 生成相同的时间戳?
【发布时间】:2011-12-13 02:15:40
【问题描述】:

假设我有一个包含以下字段的 Django 模型:

class Gizmo(models.Model):
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

当我创建一个 Gizmo 时,我可以确定 Django 将为这两个字段生成 相同 时间戳吗?我担心 Django 可能会为每个实例创建一个日期时间实例,并且这些实例会产生略有不同的时间戳。重要的是时间戳必须相同,以便有可靠的方法来确定 Gizmo 是否已更新(即,如果时间戳不同,则已更新)。

【问题讨论】:

  • 在 ./manage.py shell 中循环尝试时它做了什么?
  • 请注意,a patch 正在努力解决此问题。

标签: django datetime model


【解决方案1】:

根据一项测试,我可以告诉你答案是否定的。

test = TestModel.objects.create()
print test.date_created
# Out: datetime.datetime(2011, 12, 12, 20, 51, 41, 620985)
print test.date_last_modified
# Out: datetime.datetime(2011, 12, 12, 20, 51, 41, 621008)

我只是覆盖模型上的保存方法并自己填充这些值。

PS:我确实只是先查看了字段代码,但最后只是运行了实际测试,因为如果有两个 auto_now-type 字段或其他东西,我不知道 django 是否在模型级别的某个地方做某事。

# datetimefield
def pre_save(self, model_instance, add):
    if self.auto_now or (self.auto_now_add and add):
        value = datetime.datetime.now()
        setattr(model_instance, self.attname, value)
        return value
    else:
        return super(DateTimeField, self).pre_save(model_instance, add)

【讨论】:

    猜你喜欢
    • 2010-12-16
    • 2021-04-20
    • 2018-12-25
    • 1970-01-01
    • 2011-11-21
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多