【问题标题】:How to change the default ordering of a query?如何更改查询的默认顺序?
【发布时间】:2011-11-09 01:48:17
【问题描述】:

我不希望对查询应用任何排序。所以,我有一个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

【问题讨论】:

  • 以防万一:您是否忽略了问题模型中的class Meta 排序语句?
  • 我不想订购结果。我只想保持对象与主键列表的顺序相同。
  • @ThinhPhan 如果您希望订单遵循 PK,为什么不只是 .order_by('pk')

标签: django django-models django-queryset


【解决方案1】:

如果您想以与主键列表相同的顺序显示对象,那么您可以使用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
...

【讨论】:

  • 非常感谢。这是我需要找到的解决方案
【解决方案2】:

如果您想要一个无序的集合,请使用 Python 的 Set 对象,记录在这里: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('?')

【讨论】:

  • .order_by('?') 的好提示!!
  • order_by('?') 查询可能既昂贵又缓慢,具体取决于您使用的数据库后端。我只是保持与主键列表相同的顺序
【解决方案3】:

卢克,使用源代码,呃,文档!对,就是这样!

Django QuerySet API - order_by()

【讨论】:

  • 我认为他不想按特定领域对它们进行排序。而是按照提供的列表中建议的顺序对它们进行排序
  • 亲爱的 Peter Rowell,我在声明中使用了“Django QuerySet API - order_by()”,但它无效。 question_obj = Question.objects.filter(pk__in=[100,50,27,35,10,42,68]).order_by() 总是返回questionID的顺序。
  • @ThinhPhan:我读到“我不希望对查询应用任何排序”字面意思是您想要一个随机顺序。鉴于您接受的正确答案,您 的意思 是“我希望按照 ID 给出的顺序返回对象”。有趣的是,order_by('?') 运算符在为查询提供明确的 ID 列表(我认为是错误的行为)时默默地执行 nothing
【解决方案4】:

您可以执行一些原始 SQL(使用 FIELD()):

Ordering by the order of values in a SQL IN() clause

这应该允许您按照列表中建议的顺序检索它们。

使用 ORM 运行自定义 SQL:

https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多