Django查询给定位置

时间:2016-04-17 10:10:39

标签: python django django-queryset

我有一个带对象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

1 个答案:

答案 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进行调整。在对象具有相同票数的情况下,你还需要一些逻辑来确保确定性排序。)