【问题标题】:Difference between auto_now_add and timezone.now as default valueauto_now_add 和 timezone.now 作为默认值的区别
【发布时间】:2020-03-23 06:35:17
【问题描述】:

Django 中模型的auto_now_addtimezone.now(作为默认值)有什么区别? 示例:

create_date = models.DateTimeField(auto_now_add=True)

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

?

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

【问题讨论】:

    标签: python django django-models django-database


    【解决方案1】:

    看起来 Django 在timezone.now() under the hood 上做同样的事情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()的时刻,但这应该是纳秒级的差异。

    【讨论】:

      【解决方案2】:

      解释:

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

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

      解释链接:DateModel

      【讨论】:

      • 我想两者都会和 TZ 在一起。或不?为什么must enter date,我总是可以使用默认值?
      • 您在该字段上没有空白=True,null=True,因此默认情况下无法绕过它。 Django 将在每个保存方法中使用默认 timezone.now 保存日期时间。
      【解决方案3】:

      default 提供了一个默认值,用于在没有字段值的情况下保存实例,但仍暗示该字段是用户可编辑的,因此有人可以为该字段输入一个值。

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

      有人发布了这个on reddit

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 2018-12-25
        • 2019-02-04
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        • 2015-05-21
        相关资源
        最近更新 更多