在原始查询中包装Django查询集,反之亦然?

时间:2018-12-20 21:12:37

标签: django

我正在考虑使用一个原始查询来快速解决我的大脑或Django ORM的局限性,但是我不想重新开发支持现有ORM代码(例如过滤器)所需的基础结构。现在,我陷入了两个死胡同:

  1. 编写内部原始查询,然后像其他任何查询集一样重用该查询。即使我的原始查询选择了正确的列,我也无法对其进行过滤:

      

    AttributeError:“ RawQuerySet”对象没有属性“ filter”

    another answer证实了这一点,但我仍然希望该信息已经过时。

  2. 从查询集中获取SQL和参数,并将其包装在原始查询中。似乎应该使用queryset.query.get_compiler(DEFAULT_DB_ALIAS).as_sql()来检索原始SQL-我也将如何获取参数(显然没有实际运行查询)?

1 个答案:

答案 0 :(得分:1)

处理复杂查询的一种方法是编写一个封装查询的VIEW,然后在其前面放置一个模型。您仍然可以进行过滤(并且根据您的视图,您甚至可以下拉参数来提高查询性能)。

要获得由视图支持的模型,您需要做的就是将其设置为“非托管”,然后由迁移操作创建视图。

如果可以的话,最好尝试编写一个QuerySet,但是有时是不可能的(例如,因为您使用的是无法使用ORM表示的内容,或者您​​需要进行LATERAL JOIN之类的操作)