Как я могу использовать необработанный запрос в Django в другом наборе запросов? - PullRequest
1 голос
/ 26 января 2012

У меня есть набор запросов чистого 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 Ответ

3 голосов
/ 26 января 2012

Должен ли я просто отформатировать строку с вложенным запросом?

Да.

По сути, для этого и нужен необработанный SQL.

Он жалуется, потому что вы пытаетесь поместить SQL в слот с переменными параметрами, а адаптер db не знает, как это сделать. (на самом деле, при других обстоятельствах то, что вы делаете, это атака с использованием SQL-инъекций, и это именно та вещь, которую параметризованные запросы предназначены для предотвращения)

Просто используйте обычные операции форматирования строки, чтобы присоединиться к вашим запросам, и используйте это как источник для вашего следующего необработанного набора запросов.

(не забудьте экранировать любые символы "%" в вашем SQL, если вы используете для них интерполяцию строк Python)

...