如何在django queryset上获得下一行?

如何在django queryset上获得下一行?,django,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)

我有一个查询集,它将返回其中的几行。其中一行有一个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
对于py=2.6


应该做到这一点

查询集是生成器,因此沿着
qs[qs.indexof(slug=“…”)+1]
的路线实际上没有捷径。您提出的任何解决方案仍然需要迭代queryset(至少直到目标对象)

正如您所提到的,一种可能的方法是循环查询集,并在包含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)
虽然编写起来很有趣,但这不太可能带来任何性能好处(除非您的模型有许多字段,在这种情况下,首先遍历
values\u list()
的输出可能是有益的)


相关答案:。

我知道这将获得下一项,但我仍然需要先指向确切的行,然后才能调用next(),这是我的问题。感谢链接,我在那里找到了我的答案,其中混合了您的最后一点。我现在正关注此类型错误“QuerySet对象不是迭代器”将一个函数传递给下一个内置函数后。它们是可迭代的,因为它们返回一个迭代器,但QuerySet本身不是迭代器。事实上,它们不是迭代器。它们更像是带有额外铃铛和哨子的发电机。要获得实际的迭代器,请使用。
next(queryset.iterator())
# 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)