How can I get previous and next objects from a filtered, ordered queryset?

后端 未结 3 2147
野趣味
野趣味 2021-02-10 12:15

I have a page based on a model object, and I want to have links to the previous and next pages. I don\'t like my current solution because it requires evaluating the entire query

3条回答
  •  说谎
    说谎 (楼主)
    2021-02-10 12:40

    I'm new to Python and Django, so maybe my code is not optimal, but check this out:

    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)
    

    And in view something like that:

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

    Definitely not optimal for «heavy» querysets, but in most cases works like a charm. :)

提交回复
热议问题