django聚合字典列表

vwhgwdsa  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(86)

我有这样的情况,我有一个复杂关系的查询集,我需要这样的数据:

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,)
    )

对于第一级,它的工作很好。但是我怎样才能做出这样的聚合呢?

juud5qan

juud5qan1#

看起来好像您正在尝试对具有多级关系的查询集执行复杂的聚合。虽然Django的queryset聚合中的**ArrayAgg()[django-docs]函数可以处理简单的聚合,但它可能不足以满足您的特定情况。
要实现所需的多层次关系聚合,您可以使用Django查询集中的
values()[django-docs]和annotate()**[django-docs]方法。下面是一个示例,说明如何修改代码以获得所需的结果:

from django.db.models import F, Value, CharField

queryset = YourModel.objects.all()

# Colors aggregation
colors = queryset.values('packs__colors__title', 'packs__colors__hex_code').distinct()

# Categories aggregation
categories = queryset.values(
    'categories__title',
    'categories__parent__title',
    'categories__parent__parent__title'
).distinct()

# Transforming the aggregated data into the desired format
filters = []

# Colors
colors_filter = [{'{}': '#{}'.format(color['packs__colors__title'], color['packs__colors__hex_code'])} for color in colors]
filters.append({'colors': colors_filter})

# Categories
categories_filter = []
for category in categories:
    category_filter = {
        category['categories__title']: {
            category['categories__parent__title']: [category['categories__parent__parent__title']]
        }
    }
    categories_filter.append(category_filter)
filters.append({'categories': categories_filter})

# Resulting filters
print(filters)

在本例中,我们首先使用values方法从查询集中检索必要的字段,这些字段按相关模型分组。我们使用distinct方法来确保唯一值。
然后,我们通过迭代结果并相应地创建嵌套字典结构,将聚合数据转换为所需的格式。
最后,我们将创建的过滤器追加到filters列表中。

相关问题