Django 对象过滤器在使用最小最大范围时收到一个朴素的日期时间,而时区支持处于活动状态

Django Objects Filter received a naive datetime while time zone support is active when using min max range

提问人:Byte Insight 提问时间:10/21/2023 最后编辑:Byte Insight 更新时间:10/21/2023 访问量:47

问:

所以这个问题是关于在 Django 4.2 中查询具有最大最小值的时区感知日期范围。

时区在 settings.py 中设置为 TIME_ZONE = 'UTC',并且有问题的模型有两个字段:

open_to_readers = models.DateTimeField(auto_now=False, verbose_name="Campaign Opens")
close_to_readers = models.DateTimeField(auto_now=False, verbose_name="Campaign Closes")

查询如下所示

allcampaigns = Campaigns.objects.filter(open_to_readers__lte=today_min, close_to_readers__gt=today_max)

失败的解决方案 1

    today_min = datetime.combine(timezone.now().date(), datetime.today().time().min)
    today_max = datetime.combine(timezone.now().date(), datetime.today().time().max)
    print("Today Min", today_min, " & Today Max", today_max)

返回以下内容,这将是一个合适的日期范围,但它也给出了以下最小值和最大值的错误。

Today Min 2023-10-21 00:00:00  & Today Max 2023-10-21 23:59:59.999999

DateTimeField ... received a naive datetime (9999-12-31 23:59:59.999999) while time zone support is active.

部分工作解决方案

today_min = timezone.now()
allcampaigns = Campaigns.objects.filter(open_to_readers__lte=today_min, close_to_readers__gt=today_min)

返回结果时没有错误,但给出的时间是当前时间,而不是当天的最小值或最大值。

从这里失败的解决方案 2:

    now = datetime.now(timezone.get_default_timezone())
    today_min = now.min
    today_max = now.max
    print("Today Min", today_min, " & Today Max", today_max)

返回 Today Min 0001-01-01 00:00:00 & Today Max 9999-12-31 23:59:59.9999999 和上述时区错误。

如何为一天中的最短和最大部分创建两个时区感知日期时间?

python django 日期时间

评论


答:

1赞 willeM_ Van Onsem 10/21/2023 #1

可能最简单的方法就是:

from datetime import timedelta

from django.utils.timezone import now

date_min = now().replace(hour=0, minute=0, second=0, microsecond=0)
date_max = date_min + timedelta(days=1) - date_min.resolution
Campaigns.objects.filter(
    open_to_readers__lte=today_min, close_to_readers__gt=today_min
)

评论

0赞 Byte Insight 10/21/2023
传说!完善。谢谢:)
2赞 Yuri R 10/21/2023 #2

您可以使用make_aware

from datetime import datetime
from django.utils import timezone

current_date = timezone.now().date()
today_min = timezone.make_aware(datetime.combine(current_date, datetime.min.time()))
today_max = timezone.make_aware(datetime.combine(current_date, datetime.max.time()))

print('Today Min', today_min)
print('Today Max', today_max)

评论

1赞 Byte Insight 10/21/2023
可以确认这也有效。谢谢。