在Django中,如果我想按降序得到我的模型的最新10个实例,我可以这样做:
MyModel.objects.order_by(‘-the_field_I_want_to_order_by’)[:10]但是,我如何得到最新的10个实例的升序呢?我知道在从DB中提取它们之后,我可以在内存中重新排序它们:
reversed(MyModel.objects.order_by(‘-the_field_I_want_to_order_by’)[:10])但是,我很好奇是否有一种方法可以只使用一个查询集来完成它。
使用两个查询,我想我可以这样做:
count = MyModel.objects.count()
MyModel.objects.order_by(‘the_field_I_want_to_order_by’)[count-10:]但是,如果可能的话,用一个查询就可以得到所有这些信息。
编辑:
我要澄清的是,我并不是说上述技术太慢,或者不能接受,或者需要避免。这个问题的目的仅仅是通过QuerySet API找出什么是/不是可用的,以升序获得最新的X结果。
发布于 2014-04-18 22:22:29
您只需使用切片表示法就可以了,就像往常一样:
MyModel.objects.order_by('-the_field_I_want_to_order_by')[:10][::-1]原因是最后一个切片没有被转换成SQL --它迫使QuerySet进行计算并将其转换为列表。(这也意味着它不需要额外的查询。)
>>> type(MyModel.objects.order_by('-the_field_I_want_to_order_by')[:10])
<class 'django.db.models.query.QuerySet'>
>>> type(MyModel.objects.order_by('-the_field_I_want_to_order_by')[:10][::-1])
<type 'list'>在Python2.7上用Django 1.5进行了测试。
您还可以使用第二个方法,只使用一个使用类似策略的查询(强制计算列表):
list(MyModel.objects.order_by('the_field_I_want_to_order_by'))[-10:]但是,这种方法效率较低,因为它强制创建与MyModel.objects.all()相同大小的列表。
发布于 2014-04-20 03:47:51
谢谢大家的意见。有几个人把答案作为评论,但不是作为回答.因此,为了便于以后的可见性,这里是答案形式:
答案似乎是NO,您不能用一个QuerySet按升序得到最新的X结果,因为Django不支持从末尾切片。结果需要在内存中重新排序:
reversed(MyModel.objects.order_by(‘-the_field_I_want_to_order_by’)[:10])
# or, reorder in memory using the technique suggested by Two-Bit Alchemist:
MyModel.objects.order_by('-the_field_I_want_to_order_by')[:10][::-1] 或者您需要访问DB两次(或者不知怎么神奇地知道查询集中将有多少项):
qs = MyModel.objects.order_by(‘the_field_I_want_to_order_by’)
count = qs.count()
MyModel.objects.order_by(‘the_field_I_want_to_order_by’)[count-10:]除非您从数据库中检索大量项目,否则前一种技术可能不仅更简洁,而且更高效。
https://stackoverflow.com/questions/23162549
复制相似问题