【问题标题】:Django DateField default optionsDjango DateField 默认选项
【发布时间】:2011-01-03 00:16:52
【问题描述】:

我有一个具有日期时间字段的模型:

date = models.DateField(_("Date"), default=datetime.now())

当我在内置 django admin 中检查应用程序时,DateField 也附加了时间,因此如果您尝试保存它,则会返回错误。如何将日期设为默认值? (datetime.today() 也不起作用)

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    这就是为什么您应该始终导入基础 datetime 模块:import datetime,而不是该模块中的 datetime 类:from datetime import datetime

    您犯的另一个错误是使用() 在默认情况下实际调用该函数。这意味着所有模型都将获得类首次定义时的日期 - 因此,如果您的服务器在未重新启动 Apache 的情况下保持运行数天或数周,所有元素将获得与初始日期相同的日期。 p>

    所以字段应该是:

    import datetime
    date = models.DateField(_("Date"), default=datetime.date.today)
    

    【讨论】:

    • 有没有办法添加时间增量?例如: default=datetime.date.today + datetime.timedelta(days=4) ...此代码不起作用,但这就是想法。 (当然,保存方法是这样做的一个地方,但只是想知道是否有一种方法可以将其作为定义的一部分)
    • @Joe J:这真的应该是一个新问题。但是您可以使用可调用的事实意味着您可以定义自己的函数,返回今天+4。
    • _("Date") 在做什么?
    • @benregn 它给该字段一个“日期”标签,但使用国际化系统将其标记为翻译。
    • 感谢您澄清这一点,我刚刚开始 Django 开发,我有点不清楚它是否做的不仅仅是标签。
    【解决方案2】:

    您的错误是使用datetime 模块而不是date 模块。你打算这样做:

    from datetime import date
    date = models.DateField(_("Date"), default=date.today)
    

    如果您只想捕获当前日期,处理此问题的正确方法是使用auto_now_add 参数:

    date = models.DateField(_("Date"), auto_now_add=True)
    

    但是,modelfield docs 明确指出 auto_now_addauto_now始终使用当前日期,而不是您可以覆盖的默认值。

    【讨论】:

    • 很高兴知道auto_now_add。不过要注意的一件事是它创建了一个只读字段,这很不幸,尽管它对auto_now 有意义。
    【解决方案3】:
    date = models.DateTimeField(default=datetime.now, blank=True)
    

    【讨论】:

    • DateTimeField 不一样。如果您为 DateField 提供默认的日期时间,则会遇到麻烦。
    【解决方案4】:

    我认为解决此问题的更好方法是使用可调用的日期时间:

    from datetime import datetime
    
    date = models.DateField(default=datetime.now)
    

    请注意,没有使用括号。如果您使用括号,您将只调用一次now() 函数(在创建模型时)。相反,您将可调用对象作为参数传递,因此每次创建模型实例时都会被调用。

    归功于Django Musings。我用过,效果很好。

    【讨论】:

      【解决方案5】:

      这应该可以解决问题:

      models.DateTimeField(_("Date"), auto_now_add = True)
      

      【讨论】:

      • 我的朋友,我认为你读错了。问题是关于 DateField 而不是 DateTimeField。
      【解决方案6】:

      您也可以使用lambda。如果您使用的是django.utils.timezone.now,则很有用

      date = models.DateField(_("Date"), default=lambda: now().date())
      

      【讨论】:

      • documentation。使用 lambda 作为默认的可调用包装器并不好:Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.
      • @pulina 你是对的,但在这种情况下,当你需要将日期绑定到配置的时区时,这似乎是唯一的解决方案
      • 不。你可以在代码中指向一个实际的函数。根据this 连接的任何函数或方法引用是模型顶级函数。
      猜你喜欢
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多