Django QuerySet Limit多次击中数据库?

时间:2018-08-14 12:43:53

标签: django postgresql django-models

我最近在从Django 1.11> 2.1更新后才偶然发现生产网站上的巨大瓶颈

这是我简单的代码片段;

pages = Page.objects.filter(cat="news_item").order_by('-created')[:2]

这反过来会在该特定过滤器下创建大约30个查询,大约是页面数。

我现在已经实现了一种有点怪异的方式来解决我不满意的32个查询。

pages = [Page.objects.filter(cat='news_item').order_by('-created')[i] for i in range(0,2)]

速度显着受影响,此方法还使用了一些其他代码块,每页加载导致> 400个查询-自此以后,我对其进行了修改,以使用上述代码和Model.objects.raw的组合

我错过了Django 2.0 / 2.1中的某些更改吗?还是[:2]限制不能正常工作?

1 个答案:

答案 0 :(得分:1)

我见过的最奇怪的问题/错误/混乱。

仅执行以下查询一次;

pages = Page.objects.filter(cat="news_item").order_by('-created')[:2:1]

我在django文档中指出,它指出 https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets

  

通常,对QuerySet进行切片会返回一个新的QuerySet-它不会评估查询。如果您使用Python slice语法的“ step”参数,则是一个例外。例如,这实际上将执行查询以便返回前10个对象的每个第二个对象的列表:

     

Entry.objects.all()[:10:2]

因此,使用上述奇怪的技巧-它迫使该基本代码段立即评估和查询数据库,仅引起一个数据库查询,而不是30 +