如何获取django查询集的下一行?

Mar*_*oni 7 django

我有一个查询集,将返回其中的几行.其中一行有一个slug"slug-456",如果相对于查询集的当前排序具有slug"slug-456"的那一行之后,我如何到达下一行?

我可以遍历查询集并检查当前行是否有slug"slug-456",如果它注意到下一行是我所追求的,但有更有效的方法吗?

更新: 我是这样做的:

id_list = list(qs.values_list('id', flat=True))
try:
    next_id = id_list[id_list.index(obj.id) + 1]
    obj = Object.objects.get(id=next_id)
except IndexError:
    pass
Run Code Online (Sandbox Code Playgroud)

Alm*_*mad 8

对于py <2.6,

queryset.iterator().next()
Run Code Online (Sandbox Code Playgroud)

对于> = 2.6

next(queryset.iterator())
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩

  • 我知道这会得到下一个项目,但我仍然需要先指向确切的行才能调用next(),这就是我的问题. (4认同)

Sha*_*hin 6

查询集是生成器,因此没有真正的快捷方式qs[qs.indexof(slug="..")+1].您提出的任何解决方案仍然需要遍历查询集(至少直到目标对象).

正如您所提到的,一种可能的方法是循环查询集并在slug ="slug-456"之后返回一个查询集.

你当然可以采取更复杂的路线,并采取以下措施:

# get slugs in order
sio = list(qs.objects.values_list('slug', flat=True))
target_slug = sio[sio.index(sio) + 1] # watch for KeyError
your_object = qs.objects.get(slug__exact=target_slug)
Run Code Online (Sandbox Code Playgroud)

虽然有趣写,但这不太可能带来任何性能上的好处(除非你的模型有很多字段,在这种情况下迭代values_list()第一个输出可能是有益的).

相关回答:获取查询集中元素的索引.