而且,如果可以的话,这是否意味着我失去了将结果视为对象的优势?我发现许多 ORM 中的复杂查询令人困惑,而不仅仅是 Django 的。但是,这可能是因为我从未真正使用过 ORM。有人再直接使用 SQL 了吗?
编辑:如果我完全绕过 ORM,我是否违背了拥有框架的目的?它们都有一个“漂亮”的 ORM,但是当涉及到具有大量子查询、派生表的查询时,它看起来并不漂亮。
使用 Django 的QuerySet API你有不同的可能性:
您可以使用extra()
which 将返回一个查询集,该查询集评估为模型对象。因此,顾名思义,它在某种程度上受到了限制,因为要返回模型实例,例如必须这样做。查询模型的表。但是您可以添加额外的 SQL,例如。WHERE
orORDER
子句。使用的查询集extra()
仍然可以使用 ORM 的特性——例如链接多个filter()
。
raw()
返回 a RawQueryset
,它也可以通过迭代来获取模型实例,但是你失去了 ORM 通常会提供的许多特性。
当然,您可以使用低级连接游标 API(当然没有模型实例)直接执行 SQL。
研究有关原始查询的文档,还有很多关于例如的信息。如何将模型的字段映射到来自原始查询的数据上,并在将参数传递到查询时记录一些问题。
还要回答您编辑过的问题:当您可以使用 ORM 时,我不会使用原始 SQL,但当然 ORM 是有限的,如果您需要做一些更复杂的事情,您总是必须切换到 SQL(但是有时使用extra()
就足够了——所以你仍然可以使用 ORM 的优点)。不要忘记 ORM 适用于每个数据库后端,而自定义 SQL 可能不适用于每个数据库。