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