【问题标题】:Django model timerange filtering methodDjango模型时间范围过滤方法
【发布时间】: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')

【问题讨论】:

    标签: django django-models filtering date-range


    【解决方案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 查找可能是首选方式,即使您必须使用“虚假”开始日期。
    猜你喜欢
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2015-04-10
    • 2013-11-26
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多