auto_now_add 和 timezone.now 默认值之间的差异

wow*_*in2 10 python django django-models django-database

auto_now_addDjango 中模型的和timezone.now(作为默认值)有什么区别?例子:

create_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

create_date = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)

UPD。我说的是我总是不覆盖默认值的情况。

小智 11

default当保存实例时没有字段值时提供默认值,但仍然意味着该字段是用户可编辑的,因此有人可以输入该字段的值。

auto_nowauto_now_add暗示该字段不可由用户编辑,并且必须始终设置为此值。

有人在 reddit 上发布了这个。


wow*_*in2 1

看起来 Djangotimezone.now() 在底层做了同样的事情,在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(DateTimeField, self).pre_save(model_instance, add)
Run Code Online (Sandbox Code Playgroud)

唯一的区别是 python 调用的时刻timezone.now(),但这应该是纳秒级的差异。