编写一个复杂的 django 应用程序涉及在不同的地方(视图、模板等)使用 ORM 对象。然而,设计 ORM 模型通常是在项目开始时完成的。在那个阶段很难准确预测如何查询数据(主要使用什么 ForeignKeys)。
我们可以在许多阶段优化 ORM 进行的查询数量:
- select_related() - 在给定的 ORM 调用中
- prefetch_related() - 在给定的 ORM 调用中
- 覆盖模型 ModelManager 以预取所有查询的所有相关模型
我通常的优化方法是编写我的整个应用程序,然后使用开发人员工具栏,查看它为给定视图生成了多少查询,然后决定它们来自哪里以及如何避免它们(使用上述选项)。
但是我发现这种方法容易出错(例如,您可能忘记检查所有视图或其他背景 /celery/ 方法)。但是,我发现在编写逻辑时进行低效的优化也非常困难(因为我想专注于逻辑,而不是那时的 ORM 调用)。
所以我的问题是——优化 ORM 查询的最佳实践(最佳时机)是什么?