订单表基于提供的列表,而不是默认的django order_by

时间:2015-04-20 11:47:31

标签: python django sql-order-by

我有一个查询,如下所示,

new_list = [5, 15, 14, 23, 20]
queryset = Page.objects.filter(id__in=new_list)

当我尝试这个时,django提供了一个由id过滤的查询集。

for i in queryset:
    print i.id

结果是[5,14,15,20,23]

但我不需要任何订购。

如果我在这里使用in_bulk(),我将获得返回类型dict的结果,并使用sorted()返回一个列表。我需要一个django查询集而不是这个。有人可以告诉我如何实现这一目标吗?我的预期结果如下。

type(queryset) >> django.db.models.query.QuerySet
for i in queryset:
    print i.id
>>>[5, 15, 14, 23, 20]

请帮我找一个解决方案。

1 个答案:

答案 0 :(得分:0)

我已经得到了我的问题的答案。

id_list = [10, 3, 13, 4]
clauses = ' '.join(['WHEN id=%s THEN %s' % (pk, i) for i, pk in enumerate(id_list)])
ordering = 'CASE %s END' % clauses
queryset = Page.objects.filter(id__in=id_list).extra(
        select={'ordering': ordering}, order_by=('ordering',))

如果我使用额外的查询,因此我将获得一个queryset对象作为返回,这就是我想要的。