утверждение фильтра, основанное на вычислениях django orm - PullRequest
0 голосов
/ 28 мая 2018

как я могу перевести такой запрос в django orm?

select id, year, month 
where (year*100 + month) between 201703 and 201801

Заранее благодарен за любую помощь

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы можете сначала создать аннотацию, а затем отфильтровать ее:

<b>from django.db.models import F</b>

(Modelname.objects
          <b>.annotate(yearmonth=F('year')*100+F('month'))</b>
          .filter(<b>yearmonth__range=(201703, 201801)</b>))

Итак, здесь мы создаем аннотацию yearmonth (вы можете использовать другое имя, если хотите), и сделайте ее равнойстолбец year, умноженный на 100, плюс столбец month.Затем мы можем отфильтровать эту аннотацию и сделать это, указав __range здесь с двумя границами.

Обычно это будет работать для любой системы базы данных, которая выполняет операции, которые вы здесь выполняете (умножение столбца на константучисло, добавив два значения вместе), а также сделать фильтр __range (в MySQL это переводится в <var> BETWEEN <min> AND <max>).Однако, поскольку мы используем Django ORM, если позже мы решим использовать другую базу данных, запрос будет переведен на другой язык запросов к базе данных (конечно, если это возможно).

0 голосов
/ 28 мая 2018

Как насчет использования чего-то похожего на это?

Вы пробовали filter, и __range

Created_at будет полем в вашей БД

ModelName.objects.filter(created_at__range=(start_date, end_date))

Позже вы можете сделать расчет в этом видеэто просто обходной путь.

Если вы хотите выполнить точно такой же запрос, то, вероятно, вы можете выполнить с помощью.

ModelName.objects.raw("select id, year, month 
where (year*100 + month) between 201703 and 201801")
...