Метод фильтрации временных диапазонов модели Джанго - PullRequest
2 голосов
/ 15 июня 2010

Я видел следующие два метода в старом вопросе здесь , но мне не ясно, в чем разница между:

{'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 Ответ

5 голосов
/ 20 июня 2010

Смутился по этому поводу сам, но, думаю, я с этим справился :-D Я нашел документацию по опции поиска диапазона очень полезной.

Когда вы делаете:

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, очевидно, неверен, но вы поняли)

Надеюсь, что ответит на ваш вопрос:)

...