Django如何在backtoback注解中使用Max和Count

2024-10-05 22:49:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算每个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}]>

我怎么能拿到这个


Tags: 方法id列表releaseobjectsdevicecountdeployment
1条回答
网友
1楼 · 发布于 2024-10-05 22:49:05

不能对带注释的值使用注释。你知道吗

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}]

相关问题 更多 >