提问人:Byte Insight 提问时间:10/21/2023 最后编辑:Byte Insight 更新时间:10/21/2023 访问量:47
Django 对象过滤器在使用最小最大范围时收到一个朴素的日期时间,而时区支持处于活动状态
Django Objects Filter received a naive datetime while time zone support is active when using min max range
问:
所以这个问题是关于在 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 和上述时区错误。
如何为一天中的最短和最大部分创建两个时区感知日期时间?
答:
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
可以确认这也有效。谢谢。
评论