如何在查询中订购pk列表?

时间:2012-09-01 15:10:25

标签: django django-models django-views

我有一个pk的列表,我希望得到的结果与我的列表定义的顺序相同......但是元素的顺序是乞求改变的。怎么有人帮助我?

print list_ids

[31189,31191,31327,31406,313522,31395,31309,30071,31434,31435]

obj_opor=Opor.objects.in_bulk(list_ids).values()

for o in obj_oportunidades:
   print o

31395 31435 31434 30071 31309 31406 31189 31191 31352 31327

这个对象应该在模板中用来向用户显示一些结果......但是你怎么看,顺序与原来的list_ids不同

3 个答案:

答案 0 :(得分:1)

在SQL中使用此功能本来很不错 - 按已知的值列表进行排序。

相反,你可以做的是:

obj_oportunidades=Opor.objects.in_bulk(list_ids).values()

all_opor = []
for o in obj_oportunidades:
    print o
    all_opor.append(o)

for i in list_ids:
    if i in all_opor:
        print all_opor.index(i)

缺点是您必须首先获取所有结果行并存储它们,然后才能按照您想要的顺序获取它们。 (all_opor可以是上面的字典,表记录存储在值中,PKeys存储为dict键。)

其他方式,使用(Sort_OrderPkey)创建临时表并将其添加到查询中:

Sort_Order        PKey
    1            31189
    2            31191
...

因此,当您对Sort_Order和Opor.objects进行排序时,您将按照指定的顺序获取Pkeys。

答案 1 :(得分:1)

我找到了一个解决方案:http://davedash.com/2010/02/11/retrieving-elements-in-a-specific-order-in-django-and-mysql/它非常适合我。

ids = [a_list, of, ordered, ids]
addons = Addon.objects.filter(id__in=ids).extra(
        select={'manual': 'FIELD(id,%s)' % ','.join(map(str,ids))},
        order_by=['manual'])

此代码与MySQL“ORDER BY FIELD”类似。

答案 2 :(得分:1)

这家伙:http://blog.mathieu-leplatre.info/django-create-a-queryset-from-a-list-preserving-order.html

解决了 MySQL PostgreSQL 的问题!

如果您使用的是PostgreSQL,请转到该页面。