Django: проблема RawQuerySet с передачей нескольких параметров - PullRequest
0 голосов
/ 24 мая 2011

Я использовал ответ на этот вопрос:

Django: создание необработанного SQL-запроса, передача нескольких / повторных параметров?

ноесть некоторые проблемы.

У меня есть параметры:

params = {'film_id_string': 'core_film.parent_id', 'tags_params': 'comedy', 'order_by': 'core_film.title', 'content_type': '18', 'language_code': 'en'}

для запроса SQL:

query = 'SELECT DISTINCT "core_object".*, "core_film".*  FROM "core_film"  INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id")  LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %(film_id_string)s) LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id") LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id")  WHERE  "tagging_tag"."name" IN (%(tags_params)s) AND "core_objectlocalized"."LANG"=%(language_code)s AND content_type_id=%(content_type)s ORDER BY %(order_by)s'

Когда я пытался использовать RawQuerySet

films = Film.objects.raw(query, params)

, я получаю:

SELECT DISTINCT "core_object".*, "core_film".*
FROM "core_film"
INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id")
LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\')
LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id")
LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id")
WHERE "tagging_tag"."name" IN (E\'comedy\')
  AND "core_objectlocalized"."LANG"=E\'en\'
  AND content_type_id=E\'18\'
ORDER BY E\'core_film.title\'

Проблема в том, что каждое место с 'E\' генерирует ошибку, подобную этой:

DatabaseError: invalid input syntax for integer: "core_film.parent_id"
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil...

Как это исправить?

Django версия 1.2.3.

edit
Я не могу удалить кавычки, потому что я работаю со строкой:

result = self.function(result, tag, "core_film.parent_id")
def function(self, objects, tags, film_id_string):

Мои параметры для RawQuerySet выглядят так:

params = {'film_id_string': film_id_string}

Когда я пытаюсь разобрать это, я получаю:

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\') 

, а затем у меня возникают проблемы с

DatabaseError: invalid input syntax for integer: "core_film.parent_id"
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil...

, но когда я использую форматирование строки

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %s)' % film_id_string

это работает:

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = core_film.parent_id)

Я хочу исключить возможность внедрения SQL, поэтому исходя из Django docs Я не хочу передавать параметры с форматированием строк.
Что я еще могу сделать?

1 Ответ

1 голос
/ 25 мая 2011

Django предотвращает вставку SQL, экранируя параметры.Это оператор SQL, поэтому тот факт, что он не работает, является хорошей вещью - Django делает свою работу.Если пользователи системы не будут устанавливать значение для film_id_string, то все, что вы сделали, чтобы заставить его работать, должно быть в порядке.Если нет, то вам все равно придется использовать метод "...% s) '% film_id_string ...", но создать собственный настраиваемый фильтр для проверки того, что это одно из правильных допустимых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...