필터링 된 주문 쿼리 세트에서 이전 및 다음 객체를 어떻게 얻을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1692395

문제

모델 객체를 기반으로 한 페이지가 있으며 이전 페이지 및 다음 페이지에 대한 링크를 원합니다. 전체 쿼리 세트를 평가해야하기 때문에 현재 솔루션이 마음에 들지 않습니다 ( ids 목록), 그리고 두 개 더 get 쿼리. 분명히 이것이 한 번의 패스로 수행 할 수있는 방법이 있습니까?

def get_prev_and_next_page(current_page):
    ids = list(Page.objects.values_list("id", flat=True))
    current_idx = ids.index(current_page.id)
    prev_page = Page.objects.get(id=ids[current_idx-1])
    try:
        next_page = Page.objects.get(id=ids[current_idx+1])
    except IndexError:
        next_page = Page.objects.get(id=ids[0])
    return (prev_page, next_page)

정렬 순서는 모델에 정의되어 있으므로 여기에서 처리 할 필요는 없지만 ID가 순차적이라고 가정 할 수는 없습니다.

도움이 되었습니까?

해결책

이 페이지진이 1의 임계 값으로 설정 한 것 같습니다.

# Full query set...
pages = Page.objects.filter(column=somevalue)
p = Paginator(pages, 1)

# Where next page would be something like...
if p.has_next():
     p.page(p.number+1)

여기 문서 그리고 여기.

다른 팁

나는 Python과 Django를 처음 사용하므로 코드가 최적이 아니지만이를 확인하십시오.

def get_prev_and_next_items(target, items):
    ''' To get previous and next objects from QuerySet '''
    found = False
    prev = None
    next = None
    for item in items:
        if found:
            next = item
            break
        if item.id == target.id:
            found = True
            continue
        prev = item
    return (prev, next)

그리고 그와 비슷한 점을 볼 때 :

def organisation(request, organisation_id):
    organisation = Organisation.objects.get(id=organisation_id)
    ...
    prev, next = get_prev_and_next_items(organisation, Organisation.objects.all().order_by('type'))
    ...
    return render_to_response('reference/organisation/organisation.html', {
        'organisation': organisation,
        'prev': prev,
        'next': next,
    })

확실히«Heavy»QuerySets에 최적은 아니지만 대부분의 경우 매력처럼 작동합니다. :)

체크 아웃 Django-next-prev, 나는이 정확한 문제를 해결하기 위해 그것을 썼습니다. 이 경우 :

from next_prev import next_in_order, prev_in_order

def get_prev_and_next_page(current_page):
    page_qs = Page.objects.all()  # this could be filtered, or ordered
    prev_page = prev_in_order(current_page, page_qs)
    next_page = next_in_order(current_page, page_qs)
    return (prev_page, next_page)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top