如何在一个查询(Django ORM)中从数据库中获取每一列的唯一数据?

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

我需要从每一列获取唯一的数据 我有一个字段列表:

MY_FIELDS = ['id', 'created', 'And_more_28']

我的代码效率极低,但却产生了正确的结果

qs = Sheets.objects.all()
v = []
v += [list(qs.values(v).distinct()) for v in MY_FIELDS]

我得到了我需要的东西......但是代价是什么? (28个请求很痛苦) 告诉我如何从中进行一个查询......

这就是它为每个列生成非唯一数据的方式(尝试过)

qs = Sheets.objects.all().values(*MY_FIELDS).distinct()
django orm django-orm
1个回答
0
投票

你的第二种方法确实产生了独特的价值,但这些是独特的组合。因此,如果有 10 个字段,每个字段有 5 个值,则最多会产生 510 结果,因此它会大幅缩放。

但好消息是,我们可以通过将所有列聚合到不同的列表中来解决这个问题。事实上,与

ArrayAgg
[Django-doc]:

MY_FIELDS = ['id', 'created', 'And_more_28']

from django.contrib.postgres.aggregates import ArrayAgg

qs = Sheets.objects.aggregate(
    **{'values_{f}': ArrayAgg('f', distinct=True) for f in MY_FIELDS}
)
v = [qs[f'values_{f}'] for f in MY_FIELDS]

这将为每列生成不同值的列表,并且全部在一个单个查询中。

© www.soinside.com 2019 - 2024. All rights reserved.