Django ORM: вычисление только внутри databse-запроса возможно?

У меня есть довольно простой набор данных, который содержит следующие данные:

id    |    aqi    |    date          |    state_name
1     |    17     |    2020-01-01    |    California
2     |    54     |    2020-01-02    |    California
3     |    37     |    2020-01-03    |    California
4     |    29     |    2020-01-04    |    California

Я пытаюсь получить среднее значение aqi (air-quality-index) за апрель 2022 года минус среднее значение aqi за апрель 2021 года без использования нескольких запросов. Возможно ли это вообще или я должен использовать два запроса и сравнивать их вручную? Насколько я понимаю, я должен использовать Q-выражение для фильтрации нужных дат, верно?

AirQuality.objects.filter(Q(date__range=['2021-04-01', '2021-04-30']) & Q('2022-04-01', '2022-04-30'))

Спасибо за помощь и удачного дня!

Исходя из документации, следующее должно работать:

>>> import datetime
>>> from django.db.models import Q, Avg
>>> from django.db.models import F
>>> apr21 = Avg('aqi', filter=Q(date__range=(datetime.date(2021, 4, 1), datetime.date(2021, 4, 30)))
>>> apr22 = Avg('aqi', filter=Q(date__range=(datetime.date(2022, 4, 1), datetime.date(2022, 4, 30)))
>>> aqi_calc = Airquality.objects.annotate(apr21=apr21)
                         .annotate(apr22=apr22)
                         .annotate(diff=F('apr21') - F('apr22'))

Он должен делать все в 1 запросе, если я не ошибаюсь.

Вернуться на верх