Django: Datediff SQL запросов? - PullRequest
       2

Django: Datediff SQL запросов?

1 голос
/ 11 октября 2010

Я пытаюсь сделать эквивалент следующего SQL в Django:

ВЫБРАТЬ * ОТ Кандидата, ГДЕ date_out - date_in> = 1 И date_out - date_in <= 6 </p>

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

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

Вы можете использовать метод 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.

1 голос
/ 05 мая 2016

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

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

См .: mike-db-tools Репозиторий Github

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

Использование (Django 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)

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

...