필터링 된 주문 쿼리 세트에서 이전 및 다음 객체를 어떻게 얻을 수 있습니까?
-
18-09-2019 - |
문제
모델 객체를 기반으로 한 페이지가 있으며 이전 페이지 및 다음 페이지에 대한 링크를 원합니다. 전체 쿼리 세트를 평가해야하기 때문에 현재 솔루션이 마음에 들지 않습니다 ( 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가 순차적이라고 가정 할 수는 없습니다.
다른 팁
나는 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)
제휴하지 않습니다 StackOverflow