【问题标题】:Django queries and joinsDjango 查询和连接
【发布时间】:2017-02-07 09:22:13
【问题描述】:

我在 Django 文档中读到,原则上 Django 查询是惰性的,也就是说,除非绝对必要,否则不会查询数据库。

现在,为了提高效率,当我通过

检索数据时
FooModel.object.filter(...)

并且我已经定义了 FooModel 和 BarModel 之间的关系,是否也会自动检索来自 BarModel 的信息?还是仅当我稍后引用任何 BarModel 字段时才会发生这种情况?

在相关说明中。我一直在寻找一种简单的方法,以某种方式通过查看日志或使用调试器为自己确认这一点,但一直无法做到。我会对如何做到这一点的提示感兴趣。

【问题讨论】:

标签: django performance join


【解决方案1】:

BarModel 不会自动检索,如果您在对象过滤器内按 BarModel 字段进行过滤,它只会加入并将其用作参数。

如果您对 Django 运行的查询感兴趣,您可以使用以下内容

foo = FooModel.object.filter(...)
print(foo.query) 

要在 django 中获得额外的表格,您应该使用 select_related

【讨论】:

    【解决方案2】:

    如前所述,Django 查询和连接是惰性的。这意味着在您的情况下,除非过滤器查看子表,否则 Django 不会加入子表。除非您从代码中访问它,否则它也不会检索子对象的数据。

    您可以使用MySQL general query log 验证您的具体情况

    【讨论】:

      【解决方案3】:

      来自docs

      一般来说,QuerySet 的结果不是从数据库中获取的 直到你“要求”他们

      因此,除非您明确要求提供结果数据(即迭代时),否则您不会访问数据库。

      使用filter(..) 意味着只需在 SQL 查询中添加分句。例如,如果您使用filter(id=2),它只会在 SQL 查询中添加WHERE id=2

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 2017-06-30
        • 2018-02-08
        • 1970-01-01
        • 2013-06-26
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多