我很难理解为什么一个Queryset会按原样返回。我们为文章列出了作者,这些作者存储在一个名为:articlepage_authors
我们需要能够选择,在逐条的基础上,什么顺序,他们是返回和显示。
例如,id为44918的文章有作者13752(“Lee Bodding”)和13751(“Mark Lee”)。
我在shell中调用了它们,它返回:

Out[6]: <QuerySet [<User: Mark Lee ([email protected])>, <User: Lee Bodding ([email protected])>]>

在postgres中调用此功能:SELECT * FROM articlepage_authors;
显示用户Lee Boddingid=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”的查询集。
我不知道如何调试这个。
一个解决方案是添加另一个定义作者顺序的字段,但我想先了解一下这里发生了什么。似乎已经有什么东西在定义订单了,最好是管理好它。

最佳答案

您可以添加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')

关于django - Django Queryset结果的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55713171/

10-10 04:51