2011-02-13 47 views
6

我有一个查询集,它会返回几行。其中一行有一个slu“”slug-456“,那么在该行具有slug”slug-456“之后,如何才能进入下一行?如何获取Django查询集的下一行?

我可以遍历查询集并检查当前行是否具有slug“slug-456”,并且如果它注意到下一行是我之后的,但是有没有更高效的方法?

UPDATE: 我就是这么做的:

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 

回答

5

查询集是发电机,因此沿着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) 

而有趣的写,这是不太可能给出任何性能优势(除非你的模型有很多领域中,首先通过values_list()的输出迭代的情况可能是有益的)。

相关答案:Get the index of an element in a queryset

+0

感谢您的链接,我发现我的答案混合了你的最后一点。 – Marconi 2011-02-13 17:14:26

4

对于P < 2.6,

queryset.iterator().next() 

为> = 2.6

next(queryset.iterator()) 

应该做的伎俩

+4

我明白这将得到下一个项目,但我仍然需要指出确切的行之前,我可以调用next(),这是我的问题。 – Marconi 2011-02-13 16:59:02