【问题标题】: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

怎么样??

【问题讨论】:

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


【解决方案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 - 订购查询集没有意义,它们的评估顺序不应该对您尝试做的事情有任何影响
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2020-04-16
  • 2022-01-02
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多