Skip to main content
 首页 » 编程设计

python之django 如何在背靠背注释中的同一字段上使用 Max 和 Count

2024年10月01日32pander-it

我想计算每个 device_id 的最大 deployment__release_id 数量。我有以下内容:

release_breakdown = DeviceDeployment.objects \ 
    .values('device_id') \ 
    .annotate(release_id=Max('deployment__release_id')) \ 
    .values('release_id') 

它给了我我期望的查询集列表:

<QuerySet [{'release_id': 352}, {'release_id': 352}, {'release_id': 352}, {'release_id': 352}, {'release_id': 352}, {'release_id': 352}, {'release_id': 352}, {'release_id': 351}, {'release_id': 351}, {'release_id': 352}]> 

当我想通过以下方式获得上述计数时:

release_breakdown = DeviceDeployment.objects \ 
    .values('device_id') \ 
    .annotate(release_id=Max('deployment__release_id')) \ 
    .values('release_id') 
    .annotate(rcount=Count('release_id')) 

我收到以下错误:

Cannot compute Count('release_id'): 'release_id' is an aggregate 

我想要的是

<QuerySet [{'release_id': 352, 'rcount': 7}, {'release_id': 351, 'rcount': 2}]> 

我怎样才能得到这个

请您参考如下方法:

您不能对带注释的值使用注释。

参见 docs

您应该将查询修改为如下内容:

release_breakdown = DeviceDeployment.objects \ 
    .values('device_id') \ 
    .annotate(release_id=Max('deployment__release_id')) \ 
    .values('release_id') 
 
count = Counter(i['realease_id'] for i in release_breakdown) 

应该返回这样的列表:

[{'352': 7}, {'351': 2}]