【问题标题】:Wrapping a Django query set in a raw query or vice versa?在原始查询中包装 Django 查询集,反之亦然?
【发布时间】:2018-12-20 21:12:36
【问题描述】:

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

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

    AttributeError: 'RawQuerySet' 对象没有属性 'filter'

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

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

【问题讨论】:

    标签: django


    【解决方案1】:

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

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

    如果可以,最好尝试编写 QuerySet,但有时这是不可能的(例如,因为您使用的东西无法使用 ORM 表达,或者您需要使用 LATERAL JOIN 之类的东西) .

    【讨论】:

    • 如何将桶的动态数量传递给视图?
    • 是的,我在那里看到了你的其他帖子。我确实有一个我使用过的模式,它允许我使用 set-returning 函数作为 django 表源,但它非常 hacky。如果您可以将其作为仅注释的集合返回函数,那么schinckel.net/2018/11/02/… 可能会有所帮助,但我不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2014-05-11
    • 1970-01-01
    • 2018-05-15
    • 2021-04-16
    • 2015-11-21
    相关资源
    最近更新 更多