django查询是后续查询所需的select_related吗?

时间:2013-02-20 21:20:10

标签: django optimization

给出以下代码:

    progresses = Progress.objects.filter(customer=request.user).select_related()
    if id is not None
        progress = progresses.get(pk=id)
    else:
        progress = progresses[0]

我是否需要将select_related()添加到第二个查询,例如progress = progresses.filter(pk=id).select_related()

2 个答案:

答案 0 :(得分:1)

不,您的progress queryset对象已经包含在底层sql中的外键关系。它正在创建一个带连接的选择查询。进一步过滤不会删除连接。

docs中有一个示例可以进一步处理包含select_related的查询(但不使用filter)。

答案 1 :(得分:0)

  

filter()和select_related()链接的顺序并不重要。   这些查询集是等效的:

<DirectoryRef Id="INSTALLDIR">
  <Component Guid="..." Id="shortcuts_INSTALLDIR">
    <RegistryKey ForceDeleteOnUninstall="yes" Id="shortcuts_reg_INSTALLDIR" Key="Software\MyCompany\MyProduct" Root="HKCU">
      <RegistryValue KeyPath="yes" Name="shortcut_INSTALLDIR" Type="string" Value=""/>
    </RegistryKey>
    <Shortcut Arguments="my args " Description="my description" Id="InstallDir_my_name" Name="my name" Target="[INSTALLDIR]mydir\my.exe" WorkingDirectory="INSTALLDIR"/>
  </Component>
</DirectoryRef>

来自官方Django文档:https://docs.djangoproject.com/en/1.9/ref/models/querysets/