【问题标题】:Django: How to keep pagination consistent with a growing querysetDjango:如何使分页与不断增长的查询集保持一致
【发布时间】:2014-05-29 10:43:03
【问题描述】:

我已经求助于 stackoverflow 的专家,希望我能解决这个问题。

让我们以 Instagram 等流行应用为例。假设您决定查找带有标签 #love 的帖子(大约 551,677,074 条帖子,并且每秒都在增长!)

每页包含 15 个按发布时间降序排列的结果。当您向下滚动并加载更多内容时,它会返回下一组 15 个结果,依此类推。有人可能会问,如果查询集每秒都在增长,那么当我准备好查看第 2 页时,我如何确定第 2 页将包含与我刚刚得到的结果相关的下一组结果在第 1 页?如果查询集在增长,我是否有机会看到我之前从第 1 页获得的部分或全部结果?在用户看来,查询集就好像相对于我们上次所处的位置不断向前推进。

好吧,这就是我的困境。如果查询集在增长,如何确保我请求的下一页将从我在第 1 页中断的地方开始?

我在下面创建了以下模型:

class Blog(models.Model):
    author = models.ForeignKey(User)
    published_time = models.DateTimeField(auto_now_add=True)
    text = models.CharField(max_length=1000, blank=True)

我想创建一个按发布时间排序的一次返回 10 个博客对象的视图。

from django.core.paginator import Paginator

def BlogView(request):
    if request.META.has_key('HTTP_AUTHORIZATION') and request.method == 'GET':
        authmeth, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
                if authmeth.lower() == 'basic':
                        auth = auth.strip().decode('base64')
                        username, password = auth.split(':', 1)
                        authuser = authenticate(username=username, password=password)
                        if authuser: 
                                if authuser.is_active:

                                    queryset = Blog.objects.all().order_by('-published_time') #descending order
                                    paginator = Paginator(queryset, 10) # 10 objects per page

                                    blogs = paginator.page(page_number)
                                    data = []
                                    for blog in blogs:
                                            data.append(
                                                {'id': blog.pk,
                                                 'author_id': blog.author_id,
                                                 'text': blog.text
                                                 'published_time': blog.published_time})
                                    return HttpResponse(json.dumps({'results':data}), content_type="application/json")

非常简单的设置,但是,我不知道如何做到这一点,任何建议和示例将不胜感激!

【问题讨论】:

    标签: django pagination django-queryset


    【解决方案1】:

    这篇关于如何在 django 中设置缓存的帖子回答了这个问题:

    Caching query results in django

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 2021-05-02
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多