5

我有一个基于模型对象的页面,我希望有指向上一页和下一页的链接。我不喜欢我当前的解决方案,因为它需要评估整个查询集(以获取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 是连续的。

4

3 回答 3

8

听起来 Paginator 设置为阈值 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)

此处和此处的文档

于 2009-11-07T09:38:43.090 回答
2

我是 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,
    })

绝对不是“重”查询集的最佳选择,但在大多数情况下,它就像一个魅力。:)

于 2011-12-11T13:17:36.363 回答
1

查看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)
于 2017-04-24T01:46:36.967 回答