Django Group By Aggregation 工作直到添加其他字段

问题描述 投票:0回答:2

我想在给定的电路中对以下轨道变化进行分组,因此在索引页面上,每个电路只有一个条目。在随后的电路详细信息页面上,我将展示各种配置。

如果我保持查询简单如下它有效。

    track_listing = (Tracks.objects
                 .values('sku', 'track_name')
                 .annotate(variations=Count('sku'))
                 .order_by()
                 )

然而,添加其他字段(例如 track_id 或位置)会中断或更改分组。

        track_listing = (Tracks.objects
                 .values('sku', 'track_name', 'track_id')
                 .annotate(variations=Count('sku'))
                 .order_by()
                 )

有没有办法在保留组的同时包含其他字段。该位置不是每一行唯一的,并且有一个 track_id 示例允许我检索轨道图像。

python django django-models django-queryset django-orm
2个回答
0
投票

请为此使用子查询。

from django.db.models import Subquery, OuterRef

subquery = Tracks.objects.filter(
    sku=OuterRef('sku'),
    track_name=OuterRef('track_name')
).values('track_id')[:1]

track_listing = (Tracks.objects
    .annotate(track_id=Subquery(subquery))
    .values('sku', 'track_name', 'track_id')
    .annotate(variations=Count('sku'))
    .order_by()
    .distinct('sku', 'track_name')
)

0
投票

解决此问题的一种方法是按

sku
track_name
字段对结果进行分组,并使用单独的查询来检索每个曲目的变体的
track_id
和其他详细信息,如下所示:

# First query to retrieve the track variations
track_variations = (Tracks.objects
                    .values('sku', 'track_name')
                    .annotate(variations=Count('sku'))
                    .order_by())

# Loop through the track variations and retrieve additional details for each variation
for track in track_variations:
    # Second query to retrieve details for each track variation
    track_details = Tracks.objects.filter(sku=track['sku'], track_name=track['track_name']).values('track_id', 'location', 'other_fields')
    track['variations'] = list(track_details)
© www.soinside.com 2019 - 2024. All rights reserved.