【问题标题】:django.utils.timezone returning naive date?django.utils.timezone 返回天真的日期?
【发布时间】:2012-04-06 05:55:12
【问题描述】:

使用 django 1.4 我有一个带有日期时间字段的模型。我导入了 django.utils.timezone 作为默认值。

from django.utils import timezone
date = models.DateTimeField(default=timezone.now)

但是我仍然收到有关 DateTimeField 收到天真日期的警告。 我已将 USE_TZ 设置为 true,因此它应该返回感知日期时间

【问题讨论】:

    标签: django timezone


    【解决方案1】:

    djangos 输入一个默认的日期值,它不知道 tz,因为默认情况下该字段不可为空。将 null 设置为 true 意味着它只会将日期设置为 NULL,因此不会引发警告:

     date = models.DateTimeField(default=timezone.now, null=True)
    

    【讨论】:

    • 我可能很无知,但我不明白 null 与 timezone.now() 幼稚有什么关系。如果 Null = True 比 .now() 将返回一个感知对象?
    • django 输入的默认值不支持时区
    • @mobiletim 对此我还是有些疑惑,为什么设置null = True 会使错误消失?
    【解决方案2】:

    就我而言,我在运行测试时不断收到问题。这是因为过去的迁移错误地使用了日期时间而不是时区。我恢复到导致警告之前的迁移,删除它,再次运行 makemigrations。这为我解决了这个问题。

    【讨论】:

      【解决方案3】:

      now()

      返回代表当前的有意识或天真的日期时间 USE_TZ 分别为 TrueFalse 的时间点。

      https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.timezone.now

      【讨论】:

      • 我已将 USE_TZ 设置为 true,因此它应该返回可感知的日期时间
      【解决方案4】:

      我知道这是在回避问题,但您是否尝试过 auto_now_add=True 在您的领域?无需使用default 即可。

      另一方面,如果您确实有USE_TZ=True,您的版本应该也能正常工作。

      我会说它确实有效,并且您从直接设置 date 字段而不是默认值的地方获得 RunTimeWarning。尝试缩小更准确触发警告的时间。

      【讨论】:

      • auto_now_add 对于时区感知的 Django 应用程序来说是不好的风格
      • @fangsterr 请问你为什么这么认为?如果你也解释你的推理会更有用。
      猜你喜欢
      • 2019-05-18
      • 2014-04-20
      • 2018-03-10
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2016-06-15
      相关资源
      最近更新 更多