根据特定列表订购数据库结果
Order DB result according specific list
我需要根据一个特定字段的出现次数最多显示多行(来自数据库查询)。似乎类似的事情可以用 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}]
我现在需要的是一个按照a中的storage_id顺序排序的列表b。
结果应如下所示:
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}]
同时我使用 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'))
但我仍然想知道是否存在一个没有窗口的智能而短的函数。
我需要根据一个特定字段的出现次数最多显示多行(来自数据库查询)。似乎类似的事情可以用 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}]
我现在需要的是一个按照a中的storage_id顺序排序的列表b。
结果应如下所示:
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}]
同时我使用 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'))
但我仍然想知道是否存在一个没有窗口的智能而短的函数。