根据特定列表订购DB结果

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

我需要根据一个特定字段的最多出现来显示多行(来自db查询)。似乎这样的东西可以处理SQL窗口,遗憾的是我不能使用它。

因此,我查询数据库以计算该字段的出现次数并对出现值进行排序。所以我得到一个看起来像的列表:

a = [504, 105, 494, 493, 439]

应根据该列表排序的第二个结果如下:

b = [{'id': 3141, 'nr': 'T003745', 'storage': 'S000108', 'storage_id': 105}, 
{'id': 3140, 'nr': 'T003744', 'storage': 'S000108', 'storage_id': 105}, 
{'id': 3238, 'nr': 'T002720', 'storage': 'S001662', 'storage_id': 439}, 
{'id': 2091, 'nr': 'T002887', 'storage': 'S002268', 'storage_id': 493}, 
{'id': 2109, 'nr': 'T002924', 'storage': 'S002267', 'storage_id': 494}, 
{'id': 2103, 'nr': 'T002911', 'storage': 'S002267', 'storage_id': 494}, 
{'id': 2266, 'nr': 'T003012', 'storage': 'S002278', 'storage_id': 504}, 
{'id': 2267, 'nr': 'T002990', 'storage': 'S002278', 'storage_id': 504}, 
{'id': 2253, 'nr': 'T003066', 'storage': 'S002278', 'storage_id': 504}, 
{'id': 2258, 'nr': 'T003038', 'storage': 'S002278', 'storage_id': 504}]

我现在需要的是一个有序列表b,根据a中的storage_id序列。

结果应如下所示:

c = [{'id': 2266, 'nr': 'T003012', 'storage': 'S002278', 'storage_id': 504}, 
{'id': 2267, 'nr': 'T002990', 'storage': 'S002278', 'storage_id': 504}, 
{'id': 2253, 'nr': 'T003066', 'storage': 'S002278', 'storage_id': 504}, 
{'id': 2258, 'nr': 'T003038', 'storage': 'S002278', 'storage_id': 504},
{'id': 3141, 'nr': 'T003745', 'storage': 'S000108', 'storage_id': 105}, 
{'id': 3140, 'nr': 'T003744', 'storage': 'S000108', 'storage_id': 105},
{'id': 2109, 'nr': 'T002924', 'storage': 'S002267', 'storage_id': 494}, 
{'id': 2103, 'nr': 'T002911', 'storage': 'S002267', 'storage_id': 494},
{'id': 2091, 'nr': 'T002887', 'storage': 'S002268', 'storage_id': 493}, 
{'id': 3238, 'nr': 'T002720', 'storage': 'S001662', 'storage_id': 439}]
python-3.x django-database
1个回答
0
投票

我能够在使用PostgreSQL的窗口函数的同时解决问题。

Tool.objects.filter(tooltype_id__in=setupline
    .get_needed_toolytpe_ids())
    .filter(checked_in=True)
    .select_related('storage')
    .select_related('tooltype')
    .order_by('storage')
    .annotate(
        sum_tools=Window(expression=Count('id'),
        partition_by=F('storage_id'),)
    )
    .order_by('-sum_tools', Length('tooltype__name'))

但我仍然想知道如果没有窗口,如果存在智能和短暂的功能。

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