auto_now和auto_now_add之间的区别

Suk*_*mar 8 python django django-templates django-models django-forms

我在Django模型字段的属性中了解的是

  • auto_now -每次调用Model.save()时,将字段的值更新为当前时间和日期。
  • auto_now_add -用创建记录的时间和日期更新值。

我的问题是,如果模型中的文件同时包含auto_nowauto_now_add设置为True,该怎么办?在这种情况下会发生什么?

awe*_*oon 7

auto_now优先(显然,因为它每次都更新字段,而auto_now_add仅在创建时更新)。这是DateField.pre_save方法的代码:

def pre_save(self, model_instance, add):
    if self.auto_now or (self.auto_now_add and add):
        value = datetime.date.today()
        setattr(model_instance, self.attname, value)
        return value
    else:
        return super().pre_save(model_instance, add)
Run Code Online (Sandbox Code Playgroud)

如您所见,如果auto_now设置了或同时auto_now_add设置了两者和对象是新对象,则该字段将接收当前日期。

相同的DateTimeField.pre_save

def pre_save(self, model_instance, add):
    if self.auto_now or (self.auto_now_add and add):
        value = timezone.now()
        setattr(model_instance, self.attname, value)
        return value
    else:
        return super().pre_save(model_instance, add)
Run Code Online (Sandbox Code Playgroud)


小智 6

根据django 文档,使用 butauto_nowauto_now_addasTrue会导致错误,因为它们都是互斥的。


Har*_*war 6

正如 Django 官方文档所说 -

auto_now,auto_now_adddefault是互斥的,如果一起使用会导致错误


Alp*_*ash 6

这些字段内置于 Django 中是为了明确这个目的——每次保存对象时,auto_now 字段都会更新为当前时间戳,因此非常适合跟踪对象上次修改的时间,而 auto_now_add 字段被保存为当前时间戳行首先添加到数据库中,因此非常适合在创建时进行跟踪。