Django Queryset结果的顺序

时间:2019-04-16 16:56:52

标签: django postgresql django-queryset wagtail

我无法理解为什么查询集按其顺序返回。我们列出了文章的作者,这些文章存储在名为articlepage_authors

的ManyToMany表中

我们需要能够逐条选择返回和显示它们的顺序。

例如,id为49918的文章的作者为13752(“ Lee Bodding”)和13751(“ Mark Lee”)。

我在返回以下内容的shell中调用了它们:

Out[6]: <QuerySet [<User: Mark Lee (MarkLee@uss778.net)>, <User: Lee Bodding (LeeBodding@uss778.net)>]>

在postgres中调用它:SELECT * FROM articlepage_authors;

显示用户Lee Bodding id=13752首先存储在表中。

id  | articlepage_id | user_id
-----+----------------+---------
   1 |          44508 |    7781
   2 |          44508 |    7775
   3 |          44514 |   17240
….
 465 |          44916 |   17171
 468 |          44918 |   13752
 469 |          44918 |   13751

无论我尝试什么,例如删除作者,添加“ Lee Bodding”,保存文章,然后添加“ Mark Lee”,反之亦然-我仍然只能获得一个查询集,该查询集首先返回“ Mark Lee”。

我不确定该如何调试。

一种解决方案是添加另一个字段来定义作者的顺序,但是我想首先了解这里的情况。似乎已经在定义订单了,最好管理一下。

1 个答案:

答案 0 :(得分:2)

您可以添加an order_by to your queryset以使记录按您想要的顺序显示。警告:对于查询优化,由于性能原因,您可能需要在该字段上创建索引,具体取决于数据库:

  

默认情况下, QuerySet 返回的结果由模型的中的 ordering 选项给出的排序元组排序。 Meta 。您可以使用 QuerySet 方法逐个 order_by 覆盖它。   示例:

Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
  

上面的结果将按 pub_date 降序排列,然后按 headline 升序排列。 "-pub_date" 前面的负号表示降序。暗含升序。

您将其与an extra to order by the many-to-many ID配对:

.extra(select={
    'creation_seq': 'articlepage_authors.id'
}).order_by("creation_seq")

如果您使用的是django> 1.10,则可以直接使用该字段而无需使用extra

.order_by('articlepage_authors.id')