1
orders = Order.objects.filter(date__range=[datetime.datetime.now(), datetime.timedelta(days=1)])

我想这并不完全符合我的要求,但是当我在我的 python shell 中输入它时,我不断收到这个警告。

RuntimeWarning: DateTimeField received a naive datetime (2012-08-26 02:03:25.614372) while time zone support is active.
4

3 回答 3

9

这可能会对您有所帮助:链接。我没有检查此代码,但是:

import datetime
yesterday = datetime.date.today() - datetime.timedelta(days=1)
orders = Order.objects.filter(date__gt=yesterday)

它将带来所有订单,其中日期字段包含昨天的日期。由于您没有未来的订单,这可能会奏效。

于 2012-08-26T09:28:04.417 回答
2

Django 的 datetime 对象现在支持时区。datetime.datetime.now()返回天真的对象(无时区)。要比较它们,您需要datetime.datetime.now()了解时区。

您可以使用django.utils.timezone,它有一个 API 可以让datetime.datetime实例感知时区。

例如:

from django.utils import timezone

timezone.make_aware(datetime_object, tzinfo_object)

请参阅Django 时区

于 2012-08-26T09:25:45.167 回答
1

如果您正在使用时区感知日期,我建议您获取一天中的第一个瞬间并使用它进行过滤。

dt = timezone.now()
start = dt.replace(hour=0, minute=0, second=0, microsecond=0)
Order.objects.filter(created__gte=start)

请注意,如果您想要另一天的订单,例如昨天,这很容易:

dt = timezone.now() - timedelta(days=1)
start = dt.replace(hour=0, minute=0, second=0, microsecond=0)
end = dt.replace(hour=23, minute=59, second=59, microsecond=999999)
Order.objects.filter(created__range=(start, end))

来源在这里

于 2021-01-15T14:08:26.947 回答