RuntimeWarning:DateTimeField Model.date 在时区支持处于活动状态时接收到原始日期时间

RuntimeWarning: DateTimeField Model.date received a naive datetime while time zone support is active

我正在尝试过滤查询集以获取今年的所有帖子。

def thisYearQuerySet(objects):
    start_day = datetime.date(datetime.date.today().year, 1, 1)
    end_day = datetime.date(datetime.date.today().year, 12, 31)
    return objects.filter(date__range=[start_day, end_day])

django 抱怨 start_dayend_day 声明可能会冲突 django.utils.timezone,我认为这没什么大不了的。


但是这个警告很烦人,任何关于解除它的建议(不是禁用 django 警告)将不胜感激。比如,如何从 django.utils

中获取一年的第一天和最后一天

全面警告

RuntimeWarning: DateTimeField Model.date received a naive datetime (2021-01-01 00:00:00) while time zone support is active.
RuntimeWarning: DateTimeField Model.date received a naive datetime (2021-12-31 00:00:00) while time zone support is active.

django moans about start_day and end_day declaration may conflicts django.utils.timezone, I think it is not a big deal.

这取决于您可以接受的风险级别。如果不考虑用户的时区,thisYearQuerySet 可能会 return 去年或今年临近新年时的对象。

这是因为服务器可能 运行 在 GMT 时间,这意味着在 2022-01-01 00:00:00T00:00,它会开始 returning 带有年份日期的数据2022 年。但是,任何使用该应用程序的美国人都会在 4 个多小时内知道这一年是 2021 年,并希望在他们自己的午夜之前看到 2021 年的数据。

但是,如果您试图消除警告并且不关心上述情况,请不要在获取 today/now 时使用 python 日期时间函数。使用:

from django.utils import timezone
now = timezone.now()
today = timezone.now().date()