我正在尝试使用音乐播放器,我想从数据库中获取下一个带有当前音乐 ID 的音乐。因此,如果有人能告诉如何使用当前 ID 获取下一个主键。
这是获取当前音乐的代码。
music = Contents.objects.get(id=id)
我传递的 id 是当前音乐的主键。因此,请不要使用上面的代码,而是建议我如何获得下一首音乐。
答案 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">« 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
答案 3 :(得分:0)
只需向其添加一个 +1
即可增加值并获得下一个对象。
next_music = Contents.objects.get(id=id+1)