select_related(prefetch_related)是否提高了查询过滤器参数的性能

时间:2014-09-17 19:18:12

标签: python sql django

想象一下,我在Django模型中有以下设置

class Sale(Model):
     customer = ForeignKey(Customer)  #person who purchased something
     date = ForeignKey(Date) #date the sale was made

现在我想查看特定日期的所有销售情况并检查这些客户。我知道在过滤器上使用prefetch_related执行select_relatedCustomer有助于执行以下操作

query = Sale.objects.filter(date=some_date).prefetch_related('customer')
for sale in query:
    #do something with customer

这可以防止对客户进行大量单个SQL查找。

但如果我在查询调用之外没有使用Date,那么向prefetch添加Date是否也有助于SQL查询?

2 个答案:

答案 0 :(得分:0)

我认为这不会有助于表现。只有在循环中访问sale.date时才需要它。

另外我相信select_related是你的情况下使用的正确函数。

监视此问题的一种好方法是计算请求期间发生的查询数(使用selected_related之前/之后)。 django-debug-toolbar可以显示django orm在加载页面时所做的查询次数。

答案 1 :(得分:0)

prefetch related允许使用一些关系参数,因此您可以尝试修改您的查询,如下所示:

query = Sale.objects.filter(date=some_date).prefetch_related('customer', 'date')