2010-10-11 2 views
1

Я пытаюсь сделать эквивалент следующий SQL в Django:django: датированные sql-запросы?

SELECT * FROM WHERE заявителя date_out - date_in> = 1 И date_out - date_in < = 6

Я могу сделать это как RAW sql query, но это становится расстраивающим при работе с RawQuerySet вместо обычного объекта QuerySet, поскольку я хотел бы иметь возможность фильтровать его позже в коде.

ответ

1

Вы можете использовать метод extra() и передать его в аргументе ключевого слова where. Значение where должно быть списком, содержащим предложение SQL WHERE вышеприведенного запроса. Я проверил это с PostgreSQL 8.4, и это то, что это выглядело, как в моем случае:

q = Applicant.objects.extra(where = ["""date_part('day', age(date_out, date_in)) >= 1 and 
     date_part('day', age(date_out, date_in)) <= 6"""]) 

Это вернет вам правильный QuerySet экземпляр.

+0

Отлично, спасибо! – tufelkinder

0

Я столкнулся с проблемой Django, не поддерживающей Datediff (и другими эквивалентами баз данных), и ему нужно было использовать такую ​​функцию много раз для конкретного проекта.

При дальнейшем чтении стало ясно, что реализация вычисления интервала из двух дат сильно отличается между основными вариантами базы данных. Вероятно, поэтому в Django еще нет встроенной функции абстракции. Так что я написал свою собственную функцию Django ORM для datediff:

См: mike-db-tools Github repository

Вы увидите изменяющийся синтаксис между базами данных движками написанных в строках документации для соответствующих баз данных. Datediff поддерживает sqlite, MySQL/MariaDB, PostgreSQL и Oracle.

Использование (Джанго 1.8+):

from db_tools import Datediff 

# Define a new dynamic fields to contain the calculated date difference 
applicants = Applicant.objects.annotate(
    days_range=Datediff('date_out','date_in', interval='days'), 
) 

# Now you can use this dynamic field in your standard filter query 
applicants = applicants.filter(days_range__gte=1, days_range__lte=6) 

Я действительно очень Дерпите, когда дело доходит до моего кода, поэтому я призываю вас раскошелиться и улучшить.

Смежные вопросы