auto_now和auto_now_add之间的区别

时间:2018-07-17 19:38:08

标签: python django django-models django-forms django-templates

我从Internet上了解到的是Django模型教程

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

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

4 个答案:

答案 0 :(得分:3)

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)

如您所见,如果设置了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)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

根据django documentation使用auto_nowauto_now_add作为True会导致错误,因为它们都是互斥的。

答案 3 :(得分:0)

如Django官方文档所述-

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