【发布时间】:2021-05-06 01:23:09
【问题描述】:
我正在尝试一个音乐播放器,我想从数据库中获取具有当前音乐 ID 的下一首音乐。因此,如果有人能告诉如何使用当前 id 获取下一个主键。
这是获取当前音乐的代码。
music = Contents.objects.get(id=id)
我传递的id是当前音乐的主键。因此,请不要建议我如何获得下一个音乐,而不是上面的代码。
【问题讨论】:
标签: python python-3.x django django-models
我正在尝试一个音乐播放器,我想从数据库中获取具有当前音乐 ID 的下一首音乐。因此,如果有人能告诉如何使用当前 id 获取下一个主键。
这是获取当前音乐的代码。
music = Contents.objects.get(id=id)
我传递的id是当前音乐的主键。因此,请不要建议我如何获得下一个音乐,而不是上面的代码。
【问题讨论】:
标签: python python-3.x django django-models
只需在其中添加一个+1,这样值就会增加,然后您就可以得到下一个对象。
next_music = Contents.objects.get(id=id+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,这也将起作用。
【讨论】:
您可以使用 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">« 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 »</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
【讨论】:
我会建议你一个简单的解决方案。如果你是通过 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()
希望它能解决您的问题...
【讨论】: