想象一下,我在Django模型中有以下设置
class Sale(Model):
customer = ForeignKey(Customer) #person who purchased something
date = ForeignKey(Date) #date the sale was made
现在我想查看特定日期的所有销售情况并检查这些客户。我知道在过滤器上使用prefetch_related
执行select_related
或Customer
有助于执行以下操作
query = Sale.objects.filter(date=some_date).prefetch_related('customer')
for sale in query:
#do something with customer
这可以防止对客户进行大量单个SQL查找。
但如果我在查询调用之外没有使用Date
,那么向prefetch
添加Date
是否也有助于SQL查询?
答案 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')