Django ORM:计算只在数据库查询可能吗?



我有一个相当简单的数据集,它包含以下数据:

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

我想要实现的是2022年4月的平均aqi(空气质量指数)减去2021年4月的平均aqi,而不使用多个查询。这是可能的还是我应该使用两个查询并手动比较它们?根据我的理解,我应该使用Q-Expression来过滤正确的日期,对吗?

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

目前为止我想到的最好的解决方案是:

qs_apr20 = (
AirQuality.objects
.aggregate(apr20=Avg('aqi', filter=Q(date__range=(datetime.date(2020, 4, 1), datetime.date(2020, 4, 30)))))['apr20']
)
qs_apr21 = (
AirQuality.objects
.aggregate(apr21=Avg('aqi', filter=Q(date__range=(datetime.date(2021, 4, 1), datetime.date(2021, 4, 30)))))['apr21']
)
result = round(qs_apr21 - qs_apr20, 2)
谢谢你的帮助,祝你有美好的一天!

从文档中得到启发,以下应该可以工作:

>>> 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('apr22') - F('apr21'))

如果我没弄错的话,它应该在一次查询中完成所有操作。

相关内容

  • 没有找到相关文章

最新更新