我有这样的情况,我有一个复杂关系的查询集,我需要这样的数据:
filters: [{
colors: [{
'black': '#000000'
},
{
'white': '#111111'
}
]
},
{
categories: [{
"Digital": [{
"mobile": [{
'Apple': ['first_phone', 'second_phone']
},
{'Android': ['first_phone', 'second_phone']}
],
}]
}]
}
]
基本上,对于类别,其为3级儿童-父母情况。原因是我不想多次调用我的查询集,因为它是一个相当沉重的。
总的来说,这是我的想法:
queryset.aggregate(
colors=ArrayAgg(
{F('packs__colors__title'): F("packs__colors__hex_code")},
distinct=True,
),
categories=ArrayAgg(
{
F('categories__title'): {
F("categories__parent__title"): {
F("categories__parent__parent__title")
}
}
},
distinct=True,)
)
对于第一级,它的工作很好。但是我怎样才能做出这样的聚合呢?
1条答案
按热度按时间juud5qan1#
看起来好像您正在尝试对具有多级关系的查询集执行复杂的聚合。虽然Django的queryset聚合中的**
ArrayAgg()
[django-docs]函数可以处理简单的聚合,但它可能不足以满足您的特定情况。要实现所需的多层次关系聚合,您可以使用Django查询集中的
values()
[django-docs]和annotate()
**[django-docs]方法。下面是一个示例,说明如何修改代码以获得所需的结果:在本例中,我们首先使用
values
方法从查询集中检索必要的字段,这些字段按相关模型分组。我们使用distinct
方法来确保唯一值。然后,我们通过迭代结果并相应地创建嵌套字典结构,将聚合数据转换为所需的格式。
最后,我们将创建的过滤器追加到
filters
列表中。