我有一个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不同
答案 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_Order
,Pkey
)创建临时表并将其添加到查询中:
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,请转到该页面。