2011-02-13 4 views
6

나는 그 안에 여러 개의 행을 반환하는 쿼리 세트를 가지고 있습니다. 행 중 하나는 슬러그 "슬러그 - 456"을 가지고 있는데, 그 행이 슬러그 "슬러그 - 456"을 가진 다음 행에 어떻게 도달합니까?장고 queryset에서 다음 행을 얻는 방법?

쿼리 세트를 반복하여 현재 행에 슬러그 "slug-456"이 있는지 확인하고 다음 행이 내가 나중에 사용한다는 점에 유의해야하지만보다 효율적인 방법이 있습니까?

는 UPDATE : 나는 이런 식으로했다 : 평 < 2.6

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

Querysets는 발전기이기 때문에 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_list()의 출력을 반복하는 경우 유용 할 수 있습니다.)

관련 답변 : Get the index of an element in a queryset.

+0

링크를 보내 주셔서 감사합니다. 거기에서 내 대답이 마지막 비트를 섞어서 찾았습니다. – Marconi

+0

당신을 진심으로 환영합니다. 다행이라고 생각하면 다행입니다. –

+0

나는이 TypeError를 쳐다보고 있는데, 바로 다음 쿼리를 전달한 후에 "QuerySet 객체가 반복자가 아니다"입니다. iterator를 반환한다는 점에서 iterable이지만 QuerySet 자체는 반복자가 아닙니다. –

4

, 들어

queryset.iterator().next() 

> = 2.6

next(queryset.iterator()) 

트릭을 할해야

+4

나는 이것이 다음 항목을 얻을 것이라는 것을 이해한다. 그러나 나는 next()를 호출하기 전에 정확한 행을 먼저 가리킬 필요가있다. 이것이 내 문제 다. – Marconi

관련 문제