【问题标题】:Django ORM queryset on nested queries嵌套查询上的 Django ORM 查询集
【发布时间】:2014-11-04 00:23:58
【问题描述】:

我不知道默认的 Django ORM 如何处理如下查询:

Model.objects.filter(foreign__field=value)

它是在每一行上进行查找,还是足够聪明地用目标值解析外部字段 id?

或者这样做更便宜?

value_temp = Foreign.objects.get(field=value)
Model.objects.filter(foreign=value_temp)

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    由于 Django ORM 只是 SQL 的前端,并且由于 SQL 性能将非常依赖于数据库和上下文,因此很难一概而论。我想说,一般来说,除非您对所涉及的性能权衡有很好的理解,否则您不应该费心尝试解决直接的方法。 Django 和 SQL 数据库都在努力优化典型的查询模式。

    在您引用的具体示例中,第一个调用将在两个表之间执行JOIN,而第二个调用将进行两个单独的查询,每个查询一个表。所以因素包括:访问数据库的往返时间;外键上是否有索引; field 上是否有索引;以及数据库中的特定值。我的猜测是第一个几乎总是会更快,因为数据库是为这种查找量身定制的。 (您问:它是在每一行上进行查找还是足够聪明地用目标值解析外部字段 id? 答案是做出这个决定的是数据库,而不是 Django ;而且,是的,数据库通常会采用最有效的路线。)

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多