根据列表顺序对筛选的查询集进行排序

时间:2016-02-25 15:30:26

标签: python django django-queryset django-orm django-filter

我有一个下面描述的列表。 我想要一个将按照列表顺序排序的查询集

列表

 id_list = [3,1,2]

查询集

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

queryset按以下顺序给出对象:

obj1
obj2
obj3

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

obj3
obj1
obj2

如何??

2 个答案:

答案 0 :(得分:0)

我认为您不能使用查询集执行此操作(我也不理解您为什么要...)

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

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

答案 1 :(得分:0)

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

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

因此,您将根据所需顺序获得queryset。

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