【问题标题】:How to get next available object or primary key from database in django如何从 django 的数据库中获取下一个可用对象或主键
【发布时间】:2021-05-06 01:23:09
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    只需在其中添加一个+1,这样值就会增加,然后您就可以得到下一个对象。

    next_music = Contents.objects.get(id=id+1)
    

    【讨论】:

      【解决方案2】:

      你可以使用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,这也将起作用。

      【讨论】:

        【解决方案3】:

        您可以使用 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
        

        【讨论】:

          【解决方案4】:

          我会建议你一个简单的解决方案。如果你是通过 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()
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-20
            • 1970-01-01
            • 1970-01-01
            • 2019-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多