我想在给定的电路中对以下轨道变化进行分组,因此在索引页面上,每个电路只有一个条目。在随后的电路详细信息页面上,我将展示各种配置。
如果我保持查询简单如下它有效。
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 示例允许我检索轨道图像。
请为此使用子查询。
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')
)
解决此问题的一种方法是按
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)