gpt4 book ai didi

带排序的 Django 分页开销

转载 作者:行者123 更新时间:2023-12-02 08:53:35 25 4
gpt4 key购买 nike

我尝试使用一些排序选项在 Django 中实现分页结构,但是我不知道如何正确地做到这一点。

views.py

def search(request):
eList = Employer.objects.filter(eminence__lt=4).order_by('-eminence')

paginator = Paginator(eList, 3) # Show 3 contacts per page

page = request.GET.get('page')
try:
employerList = paginator.page(page)
except PageNotAnInteger:
employerList = paginator.page(1)
except EmptyPage:
employerList = paginator.page(paginator.num_pages)

return render_response(request, 'employer/search.html', {'employerList':employerList})

search.html

<div class="pagination">
<span class="step-links">
{% if employerList.has_previous %}
<a href="?page={{ employerList.previous_page_number }}">previous</a>
{% endif %}

<span class="current"> Page {{ employerList.number }} of {{ employerList.paginator.num_pages }}.</span>
{% if employerList.has_next %}
<a href="?page={{ employerList.next_page_number }}">next</a>
{% endif %}
</span>
</div>

此示例效果很好,但如您所见,对于每次导航,我都需要获取所有 Employer 对象。之后 Paginator 根据页码处理查询中的对象。但是,我认为分页应该在查询期间完成,并且只根据页码获取我想要的 X 个对象。当然,我可以以这种方式修改代码,但我无法弄清楚为什么人们使用 Paginator 尽管有这样的开销。我可能会忽略一个细节......

我的第二个问题是如何对我的列表进行排序?我是否应该修改我的 url 并传递排序方法和页码,并根据它们通过排序方法获取查询并将其提供给 Paginator

这对我来说似乎合理且不错,但我只是想知道在 django 中是否有更好的方法。

谢谢

最佳答案

Django 在延迟加载数据方面非常聪明,这使得这些查询非常高效。让我们来看看你的请求会发生什么......

eList = Employer.objects.filter(eminence__lt=4).order_by('-eminence')
## No database query.

paginator = Paginator(eList, 3)
## No database query.

employerList = paginator.page(2)
## SELECT COUNT(*) FROM `yourproject_employer`
## WHERE `yourproject_employer`.`eminence` < 4

# Force iteration. Same as looping over results:
foo = list(employerList.object_list)
## SELECT * FROM `yourproject_employer`
## WHERE `yourproject_employer`.`eminence` < 4
## ORDER BY `yourproject_employer`.`eminence` DESC
## LIMIT 3 OFFSET 3

至于你的排序问题,我想说的是按照你的建议简单地修改 GET 参数。只需非常小心地将其传递给数据库即可。例如,我会列出可能的种类并对此进行验证。这也意味着您不必公开数据库的内部工作。

VALID_SORTS = {
"pk": "pk",
"pkd": "-pk",
"em": "eminence",
"emd": "-eminence",
}
DEFAULT_SORT = 'pk'
def search(request):
sort_key = request.GET.get('sort', DEFAULT_SORT) # Replace pk with your default.
sort = VALID_SORTS.get(sort_key, DEFAULT_SORT)

eList = Employer.objects.filter(eminence__lt=4).order_by(sort)

关于带排序的 Django 分页开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6653638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com