如何在 Django 中按日期范围过滤查询对象?
- 2025-01-07 08:44:00
- admin 原创
- 123
问题描述:
我在一个模型中有一个字段,例如:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
现在,我需要按日期范围过滤对象。
如何筛选日期在1-Jan-2011
和之间的所有对象31-Jan-2011
?
解决方案 1:
使用
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
或者如果你只是想按月过滤:
Sample.objects.filter(date__year='2011',
date__month='01')
编辑
正如 Bernhard Vallant 所说,如果您想要一个排除的查询集,specified range ends
您应该考虑他的解决方案,它利用 gt/lt(大于/小于)。
解决方案 2:
您可以将djangofilter
与datetime.date
对象一起使用:
import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
sampledate__lte=datetime.date(2011, 1, 31))
解决方案 3:
当使用过滤器执行 django 范围时,请确保您知道使用日期对象和日期时间对象之间的区别。__range 包含日期,但如果您使用日期时间对象作为结束日期,如果未设置时间,它将不包含该天的条目。
from datetime import date, timedelta
startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
返回从开始日期到结束日期的所有条目,包括这些日期的条目。这是一个不好的例子,因为这是返回未来一周的条目,但您明白我的意思。
from datetime import datetime, timedelta
startdate = datetime.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
将缺少 24 小时的条目,具体取决于日期字段的时间设置。
解决方案 4:
您可以使用datetime.timedelta在范围内的最后一个日期上添加一天,从而解决由于对象比较精度不足而导致的“阻抗不匹配”问题(如果使用范围DateTimeField/date
则可能发生这种情况)。其工作原理如下:
start = date(2012, 12, 11)
end = date(2012, 12, 18)
new_end = end + datetime.timedelta(days=1)
ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])
正如前面所讨论的,如果不做这样的事情,最后一天的记录将被忽略。
编辑以避免使用datetime.combine
-- 与 进行比较时,坚持使用日期实例似乎更合乎逻辑DateTimeField
,而不是乱用一次性(且令人困惑)的datetime
对象。请参阅下面评论中的进一步解释。
解决方案 5:
您可以使用“__range”例如:
from datetime import datetime
start_date=datetime(2009, 12, 30)
end_date=datetime(2020,12,30)
Sample.objects.filter(date__range=[start_date,end_date])
解决方案 6:
为了使其更加灵活,您可以设计一个如下所示的 FilterBackend:
class AnalyticsFilterBackend(generic_filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
predicate = request.query_params # or request.data for POST
if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is not None:
queryset = queryset.filter(your_date__range=(predicate['from_date'], predicate['to_date']))
if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is None:
queryset = queryset.filter(your_date__gte=predicate['from_date'])
if predicate.get('to_date', None) is not None and predicate.get('from_date', None) is None:
queryset = queryset.filter(your_date__lte=predicate['to_date'])
return queryset
解决方案 7:
很简单,
YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())
对我有用
解决方案 8:
模型
date = models.DateField()
看法
def get_queryset(self):
fromDate = self.request.query_params.get('fromDate',None)
toDate = self.request.query_params.get('toDate',None)
response = yourModel.objects.filter(date__gte=fromDate,date__lte=toDate)
return response
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD