5

モデル オブジェクトに基づくページがあり、前後のページへのリンクが必要です。ids(リストを取得するために) クエリセット全体を評価し、さらに 2 つのクエリを評価する必要があるため、現在のソリューションは好きではありませんget。確かに、これを1回のパスで実行できる方法はありますか?

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

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 に答える