如何在另一个查询集中使用Django中的原始查询?

时间:2012-01-26 05:16:24

标签: django django-orm

我有一个纯SQL查询集:

SELECT ft2.user_id, avg(...) figure, count(...) as figure_count
FROM figures_table ft,
     figures_table ft2
WHERE ft.user_id=%(current)s AND
      ft.user_id != ft2.user_id AND
      ft2.user_id IN (%(others)s)
GROUP BY ft2.user_id

我想再做一个:

SELECT %(id)s as id,
       avg(figure * figure_count) figure
FROM (%(subquery)s) subquery

%(subquery)s是第一个查询。当我尝试执行像

这样的命令时
User.objects.raw(second_query, {'subquery': first_qs.query})

它引发了例外:can't adapt type QuerySet。传递字符串也不起作用,因为它在结果查询中引用。我应该使用嵌套查询格式化字符串吗?

1 个答案:

答案 0 :(得分:3)

  

我应该使用嵌套查询格式化字符串吗?

是。

这基本上就是原始SQL的用途。

它抱怨,因为你试图将SQL放在一个变量参数槽中,而db适配器不知道如何做到这一点。 (事实上​​,在其他情况下,你正在做的是SQL注入攻击,而且正是参数化查询旨在防止的那种事情)

只需使用常规字符串格式化操作来加入查询,并将其用作下一个原始查询集的源。

(请记住在SQL中转义任何“%”字符,如果你在它们上使用python字符串插值,那么)