2011-11-09 44 views
3

我不想要将任何顺序应用于查询。所以,我有一个QuerySet遵循:如何更改查询的默认排序?

question_obj = Question.objects.filter(pk__in=[100,50,27,35,10,42,68]).order_by() 

然而,当我检索的结果,他们总是被questionID订购。我遍历question_obj这是结果:

for obj in question_obj: 
    obj.questionID 

的结果显示,如:

10L 
27L 
35L 
42L 
50L 
68L 
100L 
+0

为了以防万一:您是否忽略了问题模型中的“class Meta”订单声明? –

+0

我不想订购结果。我只想保持对象与主键列表相同的顺序。 –

+1

@ThinhPhan如果你想让命令跟随PK,为什么不只是'.order_by('pk')'? – guival

回答

2

如果你想显示在同一顺序的对象作为主键列表,那么您可以使用in_bulk创建一个由pk键入的字典。然后,您可以使用列表理解来生成问题列表。

>>> pks = [100,50,27,35,10,42,68] 
>>> questions_dict = Question.objects.in_bulk(pks) 
>>> questions = [questions_dict[pk] for pk in pks] 
>>> for question in questions: 
     print question.pk 
100 
50 
27 
35 
... 
+0

一样的顺序非常感谢。这是我需要找到的解决方案 –

0

卢克,使用Source,呃文档!是的,就是这样!

Django QuerySet API - order_by()

+0

我想他不想在特定的领域订购它们。相反,按照他们在提供的列表中建议的顺序排列它们 –

+0

亲爱的彼得罗威尔,我在我的声明中使用了“Django QuerySet API - order_by()”,但它不起作用。 question_obj = Question.objects.filter(pk__in = [100,50,27,35,10,42,68])。order_by() 它总是返回questionID的顺序。 –

+1

@ThinhPhan:我读过“我不希望将任何命令应用于查询”,意思是说你想要一个随机命令。鉴于你接受的答案是正确的,你的意思是说“我希望按ID给出的顺序返回对象”。有趣的是,当给查询一个明确的ID列表(我认为是一个错误的行为)时,'order_by('?')'运算符默默地*没有*。 –

1

如果你想要一个无序集合,使用Python集对象,记录在这里:http://docs.python.org/tutorial/datastructures.html#sets

如果你想排序是相同的作为pk__in值传递的列表,你可以尝试:

ids = [100,50,27,35,10,42,68] 
questions = list(Question.objects.filter(pk__in=ids)) 
question_obj = sorted(questions, key=lambda x: ids.index(x.id)) 

编辑:而且因为它是非常不清楚你参考的数据结构是通过定义所指的“无序”什么下令:随机排序可通过以下方式实现:

.order_by('?') 
+0

尼斯提示与'。ORDER_BY( '?')'!! – jathanism

+0

order_by('?')查询可能非常昂贵并且速度很慢,这取决于您使用的数据库后端。 我刚刚保持与主键列表 –