根据列表的顺序对过滤后的查询集进行排序

Posted

技术标签:

【中文标题】根据列表的顺序对过滤后的查询集进行排序【英文标题】:Ordering filtered queryset according to a order of list 【发布时间】:2016-06-08 11:29:54 【问题描述】:

我有一个如下所述的列表。 我想要一个查询集,它将根据列表的顺序进行排序

列表

 id_list = [3,1,2]

查询集

   queryset = Variant.objects.filter(pk__in=id_list)

查询集按以下顺序给出对象:

obj1
obj2
obj3

但我希望按照给定列表中的顺序排列对象:

obj3
obj1
obj2

怎么样??

【问题讨论】:

请参考这个答案:***.com/questions/7361243/… 【参考方案1】:

不要在代码中定义排序 - 将排序列添加到您的表中并按它排序。就是这样。

class Variant(models.Model):
    order = models.IntegerField()
    ...

Variant(ordering=3).save() # id == 1
Variant(ordering=1).save() # id == 2
Variant(ordering=2).save() # id == 3

queryset = Variant.objects.filter(pk__in=id_list).order_by('order')

因此您将根据需要的顺序获得查询集。

否则谷歌:django 将列表转换为查询集并使用 Sayse 答案作为代码的基础。 一个例子:django - convert a list back to a queryset

【讨论】:

感谢您的回答。但在某些情况下我需要这个。 您应该展示这将如何应用于操作员的问题。我很确定没有任何方法可以根据 python 数组对查询集结果进行排序 我已经更新了我的答案。但请确保您是否在代码中按数据库对象 id 定义查询集顺序 - 架构有问题。【参考方案2】:

我认为你不能用查询集来做到这一点(我也不明白你为什么要......)

您可以使用地图执行此操作,但请注意,这将解决查询并且可能效率低下。

variants = list(map(lambda id: Variant.objects.get(pk=id), id_list))

【讨论】:

嘿Sayse,感谢您的回答。我可以做你描述的事情,但它给了我一个清单。我想要查询集,因为稍后我需要对该查询集进行更多过滤。 @cjahangir - 订购查询集没有意义,它们的评估顺序不应该对您尝试做的事情有任何影响

以上是关于根据列表的顺序对过滤后的查询集进行排序的主要内容,如果未能解决你的问题,请参考以下文章

根据较长列表的顺序对短列表进行排序

Python排序进阶版:根据一个列表的顺序对其他列表进行排序

Python排序进阶版:根据一个列表的顺序对其他列表进行排序

Python排序进阶版:根据一个列表的顺序对其他列表进行排序

如何根据数组元素的顺序对查询结果进行排序?

如何根据另一个列表中元组元素的顺序对元组列表进行排序?