Django小技巧03:优化数据库查询

本文介绍一个非常简单的技巧, 能够帮助你在使用 时优化数据库查询.

需要注意的是, Django QuerySets 是惰性查询的, 如果使用得当非常适用。

例如, 我们有一个叫做Invoice模型,并执行以下代码:

此时, 还没有触及到数据库,也就是说没有执行操作。当我们调用这个 QuerySet(unpaid_invoices) 才会真正的执行到数据库查询。通常情况下, 当我们去遍历这个 QuerySet 就会发生这种情况, 即 QuerySet 开始执行。如下面代码所示:

上面的代码, 看起来没有什么问题。只会执行一个数据库查询。 但是当您的模型有关系数据字段时, 比如ForeignKey,OneToOneField或ManyToManyField. 上面的查询就会发生变化了。

假设模型有一个vendor字段是个:

现在和上面的模板中一样去迭代这个 queyset, 但这次显示了供应商名称,将对数据集每一条记录执行一次额外的查询.

如果数据集有100条记录, 那么将会有101条查询生成。检索invoices所有对象的一条查询, 和每个invoice供应商的一次查询, 共计101条。

当然, 可以使用方法, 来减轻这种不期望的影响,以便在单次数据查询中,检索所有必要的信息。

所以,不要像上面那样过滤未付款的发票,可以这样做:

这样, 将会在同一查询中为每个发票检索供应商数据.因此这种情况不需要额外的查询,这样可以为您的应用程序出色的性能提升。

推荐一个可以跟踪数据库查询的调试工具Django Debug Toolbar

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181115G1GRN400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券