我有一个纯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
。传递字符串也不起作用,因为它在结果查询中引用。我应该使用嵌套查询格式化字符串吗?
答案 0 :(得分:3)
我应该使用嵌套查询格式化字符串吗?
是。
这基本上就是原始SQL的用途。
它抱怨,因为你试图将SQL放在一个变量参数槽中,而db适配器不知道如何做到这一点。 (事实上,在其他情况下,你正在做的是SQL注入攻击,而且正是参数化查询旨在防止的那种事情)
只需使用常规字符串格式化操作来加入查询,并将其用作下一个原始查询集的源。
(请记住在SQL中转义任何“%”字符,如果你在它们上使用python字符串插值,那么)