我有一个带对象id
的函数。有了这个id,我就可以获得表object_1 = Object.objects.get(pk=id)
的对象。我希望通过一个名为投票的位置来排序Object
表。例如,objects = Object.objects.order_by('-votes')
,我想在object_1
中找到objects
的位置。
我怎么能实现这一目标?据我所知,查询集不是一个列表,我不得不迭代所有元素,当表中有很多条目时,这将是一个很大的性能问题。
所有这一切的目的是显示按投票排序的排名,其中我只显示6个条目,第4个应该是对象之一。例如,如果我搜索对象1,我应该显示:
Position | Name | Votes
5 obj5 52
6 obj3 49
7 obj10 49
8 obj1 47
9 obj15 15
10 obj6 14
所以我想按此顺序获取obj5,obj3,obj10,obj1,obj15,obj6
的查询集。
最佳解决方案是执行以下操作:objects = Object.objects.order_by('-votes')[x-4:x+2]
其中x
是我正在搜索的对象的位置。
p.s:我正在使用Python 2.7.9和Django 1.9
答案 0 :(得分:0)
您可以使用简单的计数查询找到对象的位置 - 如下所示:
object_1 = Object.objects.get(pk=id)
# Count how many items have more votes than this one
# This effectively tells you the position in your ordered list
position = Object.objects.filter(votes__gt=object_1.votes).count()
# Now generate your list of nearby objects
objects = Object.objects.order_by('-votes')[position-4:position+2]
(注意:这个例子需要针对position < 4
进行调整。在对象具有相同票数的情况下,你还需要一些逻辑来确保确定性排序。)