Django 查询给定位置的有序对象

Django query ordered objects given position

我有一个接受对象的函数 id。有了这个id我就可以得到一个tableobject_1 = Object.objects.get(pk=id)的对象了。我想要 Object table 按名为 votes 的位置排序。例如,objects = Object.objects.order_by('-votes'),我想在 objects.

中找到 object_1 的位置

我怎样才能做到这一点?据我所知,查询集不是一个列表,我必须遍历所有元素,当我在 table.[=20= 中有很多条目时,这将是一个很大的性能问题。 ]

这样做的目的是为了展示一个按票数排序的排名,我只展示了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

您可以通过简单的计数查询找到对象的位置 - 如下所示:

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