我看到了很多这样的答案:
Printing a list of persons with more than one home each home with more than one
我已经用类似的模型尝试过这个答案,这似乎是一种非常低效的方法。每次迭代似乎都会进行单独的查询,有时会导致对数据库的数千个查询。我知道您可以缓存查询集,但这似乎仍然是非常错误的。所以问题是,你用过这种方法吗?如果没有,你是怎么做的?
发布于 2009-04-13 12:11:45
这是一个非常好的问题,而且不仅限于Django的ORM框架。
我总是觉得记住对象关系映射(ORM)框架解决的一些问题很重要:
ORM :如果应用程序的其余部分是基于强大的面向对象原则的,那么使用对象访问数据持久性将使代码更加连贯、内部一致,有时甚至是
请注意,速度不在列表中。ORM是代码和数据库之间的间接层。当然,我们要求ORM设计人员负责编写生成良好SQL语句的框架,但ORM的目的是提供代码和体系结构级别的效率,而不是执行效率。阅读过有关SQL的基本书籍的开发人员将始终能够获得更好的性能,直接与数据库交谈。
当然有一些策略可以解决这个问题,在Django中,正如ozan提到的那样,这些策略是select_related(),以及站点/视图/杂项缓存,但它们不会给您提供与直接SQL语句相同的性能。正因为如此,当我需要速度的时候,我永远不会使用不提供一些机制来发出原始SQL语句的ORM框架。例如,在连接多个表的数据库中生成大型报告时,我经常求助于原始SQL;ORM方法可能需要几分钟,SQL方法可能需要几秒钟。
话虽如此,我从不从担心每个单独的查询开始。我对任何接触ORM层的人的建议是:不要保护ORM的数据库访问。编写您的应用程序或模块,然后分析它,调整那些真正需要提高性能的区域,或者使用缓存/select_related来减少应用程序的总体DB-chattiness。
发布于 2009-04-13 02:03:38
您可以使用select_related() queryset method来减少数据库查询的数量。您还可以指定深度,因此在给定的示例中,如果电话号码模型具有额外的外部关系,您将使用select_related(depth=2)来避免选择更多相关实体的“级别”。
https://stackoverflow.com/questions/742697
复制相似问题