django核心分页是否首先检索所有数据?

时间:2014-08-22 03:57:03

标签: python django pagination django-1.5

我正在使用django 1.5。我需要将页面拆分为数据。我阅读了文档here。我不确定它是否首先检索所有数据。由于我有一个大表,所以使用'limit'之类的东西应该更好。感谢。

修改

我在ModelManager中使用queryset。

示例:

class KeywordManager(models.Manager):
    def currentkeyword(self, kw, bd, ed):
         wholeres = super(KeywordManager, self).get_query_set() \
                .values("sc", "begindate", "enddate") \
                .filter(keyword=kw, begindate__gte=bd, enddate__lte=ed) \
                .order_by('enddate')

        return wholeres

2 个答案:

答案 0 :(得分:2)

首先,queryset是一个懒惰的对象,django会在你请求后立即检索数据,但是如果你不这样做,django就不会碰到数据库。如果您在查询集中使用任何列表方法len(),您将评估所有查询集并强制django检索所有数据。

如果您将queryset传递给Paginator,它将无法检索所有数据,因为正如文档所述,如果您传递查询集,它将使用.count()方法来避免转换{{1进入列表并使用queryset方法。

答案 1 :(得分:0)

如果您的数据不是来自数据库,那么是 - Paginator必须首先加载所有信息才能确定如何分割"它

如果您不是,并且您只是使用Django自动生成的SQL与数据库交互,那么Paginator会执行查询以确定数据库中的项目数(即SQL COUNT())并使用您提供的值来确定要生成的页数。示例:count()返回43,您想要10个结果的页面 - 生成的页数相当于:43 % 10 + 1 = 5