Django 中模型的
auto_now_add
和 timezone.now
(默认值)有什么区别?
示例:
create_date = models.DateTimeField(auto_now_add=True)
和
create_date = models.DateTimeField(default=timezone.now)
?
UPD。我正在谈论我总是不覆盖默认值的情况。
在保存实例时没有字段值的情况下提供默认值,但仍然意味着该字段是用户可编辑的,因此有人可以为该字段输入值。default
和auto_now
表示该字段不可由用户编辑,并且必须始终 设置为此值。auto_now_add
有人在 reddit 上发布了此内容。
timezone.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)
唯一的区别是 python 调用
timezone.now()
的时刻,但这应该是纳秒级的差异。
auto_now_add=…
[Django-doc] 用于在创建或更新对象时使用时间戳。但有一些额外的含义:这意味着该字段不可编辑,因此它不会出现在 ModelForm
中,但即使您手动编辑该字段,它也不会无法 工作,因为它 不使用已设置的值,但是
timezone.now()
[GitHub]:
class DateTimeField(DateField):
# …
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)
您还可以设置 default=timzone.now()
,但默认情况下该字段仍然是可编辑的,因此您可以在模型对象上手动设置该字段。