auto_now_add 和 timezone.now 默认值之间的区别

问题描述 投票:0回答:4

Django 中模型的

auto_now_add
timezone.now
(默认值)有什么区别? 示例:

create_date = models.DateTimeField(auto_now_add=True)

create_date = models.DateTimeField(default=timezone.now)

UPD。我正在谈论我总是不覆盖默认值的情况。

python django django-models django-database
4个回答
11
投票

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

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

有人在 reddit 上发布了此内容


1
投票
看起来 Django 也做了同样的事情

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()

 的时刻,但这应该是纳秒级的差异。


0
投票

auto_now=…

 [Django-doc]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()

,但默认情况下该字段仍然是可编辑的,因此您可以在模型对象上手动设置该字段。


-1
投票
说明:

auto_now_add=True 将在保存模型上创建日期

default=timezone.now 将是带时区的默认日期,您必须输入带时区的日期

解释链接:

DateModel

© www.soinside.com 2019 - 2024. All rights reserved.