【问题标题】:Django cut queries to get only "nth to nth" resultsDjango 剪切查询以仅获得“第 n 个到第 n 个”结果
【发布时间】:2016-12-12 18:23:38
【问题描述】:

我正在使用Javascript using AJAX/Jquery 编写一个多页表视图,数据库有很多记录,所以每次用户更改页面时,都会从服务中询问一个新查询,并且只会发送那些显示的查询

假设用户点击第 5 页并选择在每页显示 15 个结果,视图应该查询结果,但只发送第 (5*15)n 个到第 (6*15)n 个对象。

1) 如上所述,您如何准确地剪切QuerySet

2) 有没有办法将其包含在 Query 本身以获得更好的性能?还是我需要先调用MyModel.objects.all() 然后截取结果?

【问题讨论】:

    标签: python sql django django-models


    【解决方案1】:

    您可以使用普通的 Python 切片对查询进行切片:

    MyModel.objects.all()[10:20]
    

    详情见:https://docs.djangoproject.com/en/1.10/topics/db/queries/#limiting-querysets

    您还应该阅读文档的这一部分:https://docs.djangoproject.com/en/1.10/topics/pagination/

    【讨论】:

    • 所以没有办法在查询调用中限制它吗?我必须先获取所有对象,然后将它们切片
    • 不,切片正在使用LIMITOFFSET 修改查询。 BTW 写在我链接的文档中。
    【解决方案2】:

    Django ORM 尊重常见的 python 列表操作模式,当您使用 MyModel.objects.all(),原始查询只有在被消费时才会执行/执行。让我们看看,

    MyModel.objects.all()[10:20]
    

    这里内部 python slice dunder 方法的工作方式是使用 LIMIT & OFFSET 查询而不是在内存中处理。

    问题的推荐解决方案

    根据您的目的使用 django 分页,您可以查看here 了解更多详细信息。

    my_list = MyModel.objects.all()
    paginator = Paginator(my_list, 15) # 15 objects per page
    

    【讨论】:

    • 啊,我可能误解了它的工作原理,所以如果我在一行x = MyModel.objects.all(),在下一行x = x.filter(pk=1),只有当我调用过滤器时才会执行查询?
    • 是的,django 查询是惰性的,但是使用 like x = list(MyModel.obejcts.all()) 时要注意,这里会执行查询
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2014-12-27
    • 2012-01-20
    • 2019-05-06
    相关资源
    最近更新 更多