将原始SQL映射到多个相关的Django模型

2024-04-19 07:07:05 发布

您现在位置:Python中文网/ 问答频道 /正文

由于性能原因,我不能使用Django的ORM查询方法,我必须使用原始SQL来处理一些复杂的问题。我想找到一种将SQL查询的结果映射到多个模型的方法。在

我知道我可以使用下面的语句将查询结果映射到一个模型,但是我不知道如何使用它来映射到相关的模型(就像我在Django中使用select_-related语句一样)。在

model_instance = MyModel(**dict(zip(field_names, row_data)))

是否有一种相对简单的方法可以映射查询结果集中的相关表的字段?在


Tags: django方法instance模型sqlmodelorm原因
1条回答
网友
1楼 · 发布于 2024-04-19 07:07:05

首先,你能证明ORM阻止了你的表现吗?有时性能问题仅仅是糟糕的数据库设计,或者不正确的索引。通常,这是因为试图将Django的ORM强制应用到遗留数据库设计中。存储过程和触发器可能会对性能产生不利影响,尤其是在使用Django时,其中触发器代码应该在Python模型代码中。在

有时性能差是应用程序的问题。这包括在数据库中执行不必要的按顺序排列的操作。在

最常见的性能问题是应用程序“过度获取”数据。随意使用.all()方法并创建大型内存集合。这会影响性能。Django查询集必须尽可能少地被触摸,这样查询集迭代器就被赋予模板以供显示。在

一旦您选择绕过ORM,您就必须解决对象关系阻抗失配问题。再一次。具体地说,关系型“导航”没有“相关”的概念:它必须是使用外键的关系集的一级获取。通过SQL组装一个复杂的内存对象模型非常困难。循环引用使这变得非常困难;将FK解析为集合很困难。在

如果要使用原始SQL,有两种选择。在

  1. 避免“选择相关”它不存在,而且实现起来很痛苦。

  2. 创造你自己的类似ORM的“选择相关”特性。一种常见的方法是添加有状态的getter,这些方法(A)检查私有缓存以查看它们是否已获取相关对象以及该对象是否不存在,(b)从数据库中获取相关对象并更新缓存。

在发明自己的有状态getter的过程中,您将重新设计Django的,您可能会发现它不是ORM层,而是数据库设计或应用程序设计问题。在

相关问题 更多 >