Django模型时间范围过滤方法
Posted
技术标签:
【中文标题】Django模型时间范围过滤方法【英文标题】:Django model timerange filtering method 【发布时间】:2011-03-03 21:34:49 【问题描述】:我在一个老问题here 中看到了接下来的两种方法,但我不清楚它们之间有什么区别:
'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
datetime.datetime.combine(date, datetime.time.max))
和
YourModel.objects.filter(datetime_published__year='2008',
datetime_published__month='03',
datetime_published__day='27')
【问题讨论】:
【参考方案1】:我自己对此感到困惑,但我想我已经解决了:-D 我发现 the documentation about the range lookup option 非常有帮助。
当你这样做时:
YourModel.objects.filter(datetime_published__year='2008',
datetime_published__month='03',
datetime_published__day='27')
SQL 将类似于:
SELECT ... WHERE EXTRACT('year' FROM pub_date) = '2008'
AND EXTRACT('month' FROM pub_date) = '03'
AND EXTRACT('day' FROM pub_date) = '27';
而这部分 django 基于日期的通用视图:
'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
datetime.datetime.combine(date, datetime.time.max))
变成这样:
YourModel.objects.filter(datetime_published__range=(
datetime.datetime.combine('2008-03-27',datetime.time.min),
datetime.datetime.combine('2008-03-27',datetime.time.max)
)
按照以下方式生成 SQL:
SELECT ... WHERE datetime_published BETWEEN '2008-03-27 00:00:00'
AND '2008-03-27 23:59:59';
(上一个SQL示例中时间戳的格式显然是错误的,但你明白了)
希望能回答你的问题:)
【讨论】:
我希望最后一个 SQL 在大多数数据库上会更快,因为它可以进行优化,因此使用range
查找可能是首选方式,即使您必须使用“虚假”开始日期。以上是关于Django模型时间范围过滤方法的主要内容,如果未能解决你的问题,请参考以下文章