我很难理解为什么一个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 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”的查询集。
我不知道如何调试这个。
一个解决方案是添加另一个定义作者顺序的字段,但我想先了解一下这里发生了什么。似乎已经有什么东西在定义订单了,最好是管理好它。
最佳答案
您可以添加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/