【问题标题】:Getting sum of averages in a django queryset在 django 查询集中获取平均值的总和
【发布时间】:2021-12-29 10:42:30
【问题描述】:
def get_queryset(self):
    current_academic_year = get_current_academic_year()
    domains = Domain.objects.all()
    start_date = self.request.query_params.get("start_date", current_academic_year.start_date)
    end_date = self.request.query_params.get("end_date",  current_academic_year.end_date)
    queryset = Account.objects.annotate(**{
        f"domain_overall_{domain.uuid}": Avg(
            "assessed_from__accountevaluationresult__calculated_rating",
            filter=Q(
                assessed_from__updated__range=(start_date, end_date)
            ) & Q(assessed_from__domain=domain)
        )
        for domain in domains
    }).annotate(**{f"domains_total": ~query~
    })

有五个域。 在这里,我得到了 5 个键值对,每个域都有特定的计算值。 我需要从第一个注释中获取这些值的总和,但不知道如何在连续注释中检索它。

我在 json 中需要的响应必须是这样的:

  • “domain_overall_8939396e-d0a9-4c87-afe1-ae3a4660d84b”:2,
  • “domain_overall_786a99b4-38fd-4b60-ac91-5a09f007db32”:1,
  • "domain_overall_a1f503a7-5e77-47ee-a812-7ae1fb4e8a84": 1,
  • “domain_overall_4c55b38b-8471-48d1-bc43-323570b290a4”:1,
  • “domain_overall_6ec0c80b-5afe-4ac2-8c07-0fff5c4f023c”:3,
  • “域总数”:8,

这里最好的方法/解决方案是什么?

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    因为无论如何你都想从 db 中获取所有平均值,所以我会在获取数据后计算 Python 中所有值的总和。

    首先,让我们简化查询集:

    queryset = Account.objects.filter(assessed_from__domain__in=domains).annotate(
        domain=F('assessed_from__domain'),
        average=Avg("assessed_from__accountevaluationresult__calculated_rating",
                    filter=Q(assessed_from__updated__range=(start_date, end_date)
    ).values('domain', 'average')
    

    这可以使用普通 Python 来完成,例如:

    total_sum = sum(d.average for d in queryset)
    

    这也可以使用 Pandas 更快地完成,例如:

    df = pd.DataFrame(queryset)
    total_sum = df['average'].agg('sum')
    

    通过这种方法,您还可以更轻松地将其序列化为 JSON:

    df = df.append({"domain": "domains_totals", "average": total_sum}, ignore_index=True)
    df = df.set_index("domain")
    json_str = df['average'].to_json()
    

    【讨论】:

    • 感谢您非常清楚的解释。我会尝试这种方法。
    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多