Django 对象过滤在使用最小最大范围时接收到一个无意义的日期时间,而时区支持是激活状态
问题描述
所以这个问题是关于在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)
返回今天的最小值 0001-01-01 00:00:00 & 今天的最大值 9999-12-31 23:59:59.999999,并且上述时区错误。
我如何创建两个有时区意识的日期时间,分别表示一天的最小和最大部分?
解决方案
最简单的方法可能是:
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
)