Django 对象过滤在使用最小最大范围时接收到一个无意义的日期时间,而时区支持是激活状态

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
)

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程