【问题标题】:Difference between auto_now and auto_now_addauto_now 和 auto_now_add 之间的区别
【发布时间】:2018-12-25 14:35:22
【问题描述】:

我在Djangomodels字段的属性中理解的是

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

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

【问题讨论】:

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


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        根据django documentation 在模型字段中同时使用auto_nowauto_now_add 作为True 将导致错误,因为它们都是互斥的。

        【讨论】:

          【解决方案4】:

          正如官方 Django 文档所说 -

          auto_nowauto_now_adddefault互斥,一起使用会报错

          【讨论】:

            【解决方案5】:

            如果模型中的文件同时包含 auto_nowauto_now_add 设置为 True 将导致如下错误:

            错误: appname.Model.field_name: (fields.Efield_number) 选项 auto_now、auto_now_add 和 default 是互斥的。可能只存在这些选项之一。

            【讨论】:

              猜你喜欢
              • 2010-12-16
              • 2021-04-20
              • 1970-01-01
              • 2011-11-21
              • 1970-01-01
              • 2013-02-14
              • 2020-03-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多