而且,如果可以,这是否意味着我失去了将结果视为对象的优势?我发现复杂的查询在许多ORM中都很混乱,而不仅仅是Django。但是,这可能是因为我从未真正使用过ORM。有没有人再使用直接SQL?
编辑:如果我完全绕过ORM,我是否会破坏拥有框架的目的?它们都有一个“漂亮”的ORM,但是当涉及到包含大量子查询,派生表的查询时,它看起来并不漂亮。
答案 0 :(得分:2)
使用Django的QuerySet API你有不同的可能性:
您可以使用extra()
来返回一个评估模型对象的查询集。因此,正如名称所说,它在某种程度上是有限的,因为对于返回模型实例,有必要例如。查询模型的表。但是你可以添加额外的SQL,例如。 WHERE
或ORDER
条款。使用extra()
的查询集仍然可以使用ORM的功能 - 例如链接多个filter()
。
raw()
返回一个RawQueryset
,它也可以迭代以获取模型实例,但是你会丢失ORM通常会提供的许多功能。
当然,你可以使用low level connection cursor API直接执行SQL(当然没有模型实例)。
研究the documentation on raw queries,还有很多关于例如的信息。如何在来自原始查询的数据上映射模型的字段,并在将参数传递给查询时记录一些问题。
还要回答您编辑过的问题:当您使用ORM时我不会使用原始SQL,但当然ORM是有限的,如果您需要做一些更复杂的事情,您将始终必须切换到SQL(但有时使用extra()
就足够了 - 所以你仍然可以使用ORM的优点)。不要忘记ORM适用于每个数据库后端,而自定义SQL可能不适用于每个数据库。
答案 1 :(得分:1)
您可以使用原始SQL return objects;或者如果你想要你可以bypass the ORM completely。