【问题标题】:Django: Fetch next set of queries from Django database for async loadingDjango:从 Django 数据库中获取下一组查询以进行异步加载
【发布时间】:2018-07-16 05:30:14
【问题描述】:

例如,如果我的 Django 表有数百行,并且最初在一个视图中,我会获取以下格式的前 10 条记录以显示在网页上。

def fetchtExperts(request):
    if request.method == "GET":
        experts = Experts.objects.exclude(client_assigned=None).values('id', 'name', 'age').order_by('qualification')[:10]

    return render(request, 'index.html', {'experts': experts})

如果这 10 条记录显示在第 1 页上,我希望在用户单击第 2 页时显示接下来的 10 条记录。如何从最后获取的记录之后的记录开始获取接下来的 10 条记录?我是否将第 1 页的最后一条记录的 ID 发送到视图,以便我可以相应地获取接下来的 10 条记录,还是有更好的方法来实现这一点?

【问题讨论】:

    标签: mysql django django-views django-queryset django-orm


    【解决方案1】:

    Django 为此类问题提供了Pagination 工具。改变你的看法:

    from django.core.paginator import Paginator
    
    def fetchtExperts(request):
        experts = Experts.objects.exclude(client_assigned=None).values('id', 'name', 'age').order_by('qualification')
        paginator = Paginator(experts, 10) # Show 10 contacts per page
    
        page = request.GET.get('page')
        experts = paginator.get_page(page)
        return render(request, 'list.html', {'experts': experts})
    

    使用此方法,您需要将页码作为 GET 参数传递:http://mypage.com/view?page=1

    【讨论】:

    • 我试过了,但我无法遍历模板中的对象。我可以使用{{ experts.object_list }} 查看对象。正如你提到的,我可以通过GET 发送页码,但我遗漏了一些东西。我检查了docs.djangoproject.com/en/2.0/topics/pagination/…,它与您的答案相似,模板中通过 Querset 的迭代也是正常的,但我无法模拟结果。
    • 没有错误,我只是无法迭代。它不是 Queryset 数据类型。如果我在render 之前打印experts(我已经使用了你的代码)我得到<Page 2 of 2> 但是如果我打印experts.object_list 我可以看到所有对象的列表[{'id': 28, 'name': 'q8', 'age': 20}, {'id': 29, 'name': 'asdasd', 'age': 26]
    • @hulkinBrain 你是如何迭代的?
    • 点赞{% for expert in experts %} {{ expert.name }} {% endfor %}
    • 没关系,我想通了,我只需要传递paginator.page(page) 作为上下文而不是experts。感谢您的回答!干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2022-01-05
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多