python - 如何聚合查询集中多个日期范围的总和?

标签 python django django-views django-queryset

是否可以在一个 QuerySet 中对多个日期范围内的 .sum() 进行注释

即,基本上将这些结合起来,因此每个对象都有每个日期范围的总和。

query_set_week = DailyReports.objects.filter(
    date__range=('2018-08-27', '2018-08-31')) \
        .select_related('profile') \
        .values('profile__user_id') \
        .annotate(premium=Sum('total_field'),
            first_name=F('profile__user__first_name'),
            last_name=F('profile__user__last_name') \
        .order_by('profile__agent_code')


query_set_year = DailyReports.objects.filter(
    date__range=('2018-01-01', '2018-08-31')) \
        .select_related('profile') \
        .values('profile__user_id') \
        .annotate(premium=Sum('total_field'),
            first_name=F('profile__user__first_name'),
            last_name=F('profile__user__last_name') \
        .order_by('profile__agent_code')

两者都单独工作,但很难循环并显示数据(例如,用户 - 周总计 - 年总计),因为有人可能在年份过滤器中有结果,但在周过滤器中没有结果。

编辑:我目前能够使用 .raw() 和大量 SQL 语句来实现我的目标,但我认为有一种更 Pythonic 的方法来实现它。

最佳答案

如果您想要多行,您可以 union two querysets像这样:

base_qs = DailyReports.objects \
        .select_related('profile') \
        .values('profile__user_id') \
        .annotate(premium=Sum('total_field'),
            first_name=F('profile__user__first_name'),
            last_name=F('profile__user__last_name') \
        .order_by('profile__agent_code')

query_set_week = base_qs.filter(date__range=('2018-08-27', '2018-08-31'))
query_set_year = base_qs.filter(date__range=('2018-01-01', '2018-08-31'))

query_set_week_and_year = query_set_week.union(query_set_year)

query_set_week_and_year 只需执行一个 SQL 查询即可为您提供两行!


这里发生了什么?

最重要的是,django 在计算查询集之前不会执行任何 SQL(例如迭代、list()-ed、len()-ed、and so on )。所以我们只是构建 SQL,而不是执行看似 4 个查询!

大多数数据库(我认为甚至是 sqlite)都有一些查询优化。 IE。它将看到两个查询中重复的事情,并首先执行该操作(以代码似乎正在执行的方式)。所以我们应该以(几乎)最有效的方式做到这一点。


所以它不应该太耗时,我认为提供了一些可读的代码(?)!

关于python - 如何聚合查询集中多个日期范围的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52157649/

相关文章:

python - 如何在keras中连接两层?

python - 简单的网页更改或按钮删除和抓取的数据是无用的

django - django Rest auth 和 React Native 的问题

python - 在 Ubuntu 服务器上部署 Django 应用程序时遇到问题

django - ModelSerializer.update() 和 ModelViewSet.update() 之间的区别

python - 我的 Django View 说它只接受一个参数并给出两个但只有一个

python - 以字符串形式返回模板 - Django

python - 属性错误: 'module' object has no attribute '__path__' Anaconda

django - 重命名 models.py 中主键的字段

Python:确定要创建的线程数