如何从django中的数据库获取下一个可用对象或主键

时间:2021-02-01 20:51:09

标签: python python-3.x django django-models

我正在尝试使用音乐播放器,我想从数据库中获取下一个带有当前音乐 ID 的音乐。因此,如果有人能告诉如何使用当前 ID 获取下一个主键。

这是获取当前音乐的代码。

music = Contents.objects.get(id=id)

我传递的 id 是当前音乐的主键。因此,请不要使用上面的代码,而是建议我如何获得下一首音乐。

4 个答案:

答案 0 :(得分:5)

我会建议你一个简单的解决方案。如果您通过 id+1 获取对象,那么如果删除了某个元素,则会导致错误。

所以只需过滤大于当前 id 的 id 并取第一个。

music= Contents.objects.filter(id__gt=id).order_by('id').first()
if music is None:
    music= Contents.objects.all().order_by('id').first()

else 条件是如果当前音乐是最后一首,则选择第一首。下面我只说如何选择以前的音乐

music= Contents.objects.filter(id__lt=id).order_by('id').last()
if music is None:
    music= Contents.objects.all().order_by('id').last()

希望它能解决您的问题...

答案 1 :(得分:1)

您可以使用iterator()

q = Contents.objects.filter(id__gt=current_music_object.id)
next(q.iterator())

前提是这些分类正确。 或者您可以使用查询集切片:

next_music_object = Contents.objects.filter(id__gt=current_music_object.id)[0]

如果您删除了中间的某些 ID,这也将起作用。

答案 2 :(得分:1)

您可以使用 django Pagination - 参见 The Paginator class

然后你可以这样做:

from django.core.paginator import Paginator
from django.shortcuts import render

def contentsList(request, template_name="music.html"):
    data = {}
    music = Contents.objects.order_by('-pk')

    paginator = Paginator(querySet, 1)
    # get your page from GET
    page = request.GET.get('page')
    data[page_obj] = paginator.get_page(page)
    return render(request, template_name, data)

在您的模板中,您可以这样做:

{% for music in page_obj %}
    
    {{ music.title }}<br>
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

Paginator 一个对象列表,加上您希望在每个页面上拥有的项目数,它为您提供访问每个页面项目的方法:

>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages
2
>>> type(p.page_range)
<class 'range_iterator'>
>>> p.page_range
range(1, 3)

>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']

>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True

答案 3 :(得分:0)

只需向其添加一个 +1 即可增加值并获得下一个对象。

next_music = Contents.objects.get(id=id+1)
相关问题