我最近在从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]限制不能正常工作?
答案 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 +