Django - 按具有日期范围的 DateTimeField 过滤对象
Django - Filter objects by DateTimeField with a date range
我有一个如下所示的日期时间字段,
class Data(models.Model):
time = models.DateTimeField(default=timezone.now)
我想根据模板表单中的日期范围获取对象。
我已经看到过滤 DateField 但不是 DateTimeField 的方法。
有人可以帮忙吗?
筛选日期时间字段时,用于比较的值必须具有Python日期时间类型。您可以使用 datetime.strptime 从字符串格式化 DateTime 变量,然后应用 __gte __lte ... 等运算符进行过滤。
我偶然发现了这个,因为它帮助我找到了解决我自己问题的方法,所以我想添加更多细节。
评论中提到的错误是
RuntimeWarning: DateTimeField [...] received a naive datetime [...] while time zone support is active.
基本上只是意味着需要了解日期才能进行比较。
在这种情况下,根据对提到错误的问题的评论, range
运算符如果已修复(确实如此),应该可以正常工作。
我们只需要给它一个已知的日期时间值,而不是给运算符简单的值。
from datetime import datetime, timedelta
from django.utils import timezone
# the datetime value passed to make_aware() can be any datetime
# you could even use datetime.strptime() if you want
# (as mentioned in the accepted anwser)
# there are more ways to make datetime aware
# but this was simplest to me
aware_datetime = timezone.make_aware(datetime.now())
# storing the two dates for easier reading
start_date = aware_datetime - timedelta(days=1)
end_date = aware_datetime + timedelta(days=1)
filtered_qs = Model.objects.filter(DateTimeField__range=[start_date, end_date])
我有一个如下所示的日期时间字段,
class Data(models.Model):
time = models.DateTimeField(default=timezone.now)
我想根据模板表单中的日期范围获取对象。 我已经看到过滤 DateField 但不是 DateTimeField 的方法。 有人可以帮忙吗?
筛选日期时间字段时,用于比较的值必须具有Python日期时间类型。您可以使用 datetime.strptime 从字符串格式化 DateTime 变量,然后应用 __gte __lte ... 等运算符进行过滤。
我偶然发现了这个,因为它帮助我找到了解决我自己问题的方法,所以我想添加更多细节。
评论中提到的错误是
RuntimeWarning: DateTimeField [...] received a naive datetime [...] while time zone support is active.
基本上只是意味着需要了解日期才能进行比较。
在这种情况下,根据对提到错误的问题的评论, range
运算符如果已修复(确实如此),应该可以正常工作。
我们只需要给它一个已知的日期时间值,而不是给运算符简单的值。
from datetime import datetime, timedelta
from django.utils import timezone
# the datetime value passed to make_aware() can be any datetime
# you could even use datetime.strptime() if you want
# (as mentioned in the accepted anwser)
# there are more ways to make datetime aware
# but this was simplest to me
aware_datetime = timezone.make_aware(datetime.now())
# storing the two dates for easier reading
start_date = aware_datetime - timedelta(days=1)
end_date = aware_datetime + timedelta(days=1)
filtered_qs = Model.objects.filter(DateTimeField__range=[start_date, end_date])