首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:解压参数列表以在聚合查询中使用

Django:解压参数列表以在聚合查询中使用
EN

Stack Overflow用户
提问于 2010-02-20 22:04:35
回答 2查看 985关注 0票数 1

我正在尝试创建一个半动态聚合函数,它将返回列表中所有字段的总和。假设运行get_query_set()将返回一个经过过滤的查询,其中包含列表中的所有字段以及其他一些可能无法很好地处理Sum聚合的字段(日期字段、字符字段、外键等)。

到目前为止我想出的最好的例子如下,这在很大程度上是一个关于Django特定用法的python问题,尽管我的Python-Fu还不是最强的……

作品

代码语言:javascript
复制
qs = cl.get_query_set().aggregate(Sum('permits_submitted'), Sum('permits_pulled'), Sum('permits_posted'))

return:{ 'permits_posted__sum':5772,‘posted_posted__sum’:6723,‘posted_sum_sum’:7276}

不工作

代码语言:javascript
复制
qs = cl.get_query_set().aggregate(Sum('permits_submitted')).aggregate(Sum('permits_pulled'))

返回:错误

代码语言:javascript
复制
qs = cl.get_query_set().aggregate(Sum('permits_submitted', 'permits_pulled', Sum('permits_posted'))

返回:错误

不起作用-提出想法

代码语言:javascript
复制
tuple = (
        'permits_submitted',
        'permits_pulled',
        'permits_posted',
    )

qs = cl.get_query_set()
for field in tuple:
    qs.aggregate(Sum(field))

返回:错误

代码语言:javascript
复制
qs = cl.get_query_set()
qs.aggregate(*[Sum(field) for field in tuple])

返回:

代码语言:javascript
复制
[<permit_runner: User's report for 2010-02-18>, <permit_runner: User's report for 2010-02-19>, '...(remaining elements truncated)...'] 

(这与未聚合的返回值相同)

作品

代码语言:javascript
复制
qs = cl.get_query_set()
qs = qs.aggregate(*[Sum(field) for field in tuple])

在添加聚合时错过了定义qs =-有助于休息几分钟,让自己看起来更清新

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-22 17:19:35

由于这项工作,我把它作为答案,所以人们在谷歌搜索时会很容易找到它:

代码语言:javascript
复制
qs = cl.get_query_set()
qs = qs.aggregate(*[Sum(field) for field in tuple])
票数 3
EN

Stack Overflow用户

发布于 2022-01-03 21:44:51

创建动态聚合(或动态注释)

代码语言:javascript
复制
from typing import Dict
from django.db.models import Q, Sum


# 1. Prepare your querysets
years = year_allowances.values_list("year", flat=True)  
time_aways = TimeAway.objects.filter(  
    sequence__pk__in=sequences.values_list("pk", flat=True)  
).actual_paid_sick_leave()  

# 2. Define your individual aggregate expression.
def get_aggregate(key) -> Dict[str, Sum]:  
    return {  
        str(key): Sum(F('actual_paid_sick_leave'), filter=Q(local_timezone_start__year=key))  
    }  

# 3. Create the dictionary of aggregate expressions.
aggregate_expressions = {}  
ds = [{**get_aggregate(year)} for year in years]  
for d in ds:  
    aggregate_expressions.update(d)

# 4. Create your aggregations.
x = time_aways.aggregate(**aggregate_expressions)
>> x = {'2021': datetime.timedelta(0), '2022': datetime.timedelta(days=5)}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2302433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档