Отказ от ответственности: Я все еще изучаю Django, таким образом, я мог бы пропускать что-то здесь, но я не вижу, каково это было бы...
Я запускаю Python 2.6.1 и Django 1.2.1.
(InteractiveConsole)
>>> from myproject.myapp.models import *
>>> qs = Identifier.objects.filter(Q(key="a") | Q(key="b"))
>>> print qs.query
SELECT `app_identifier`.`id`, `app_identifier`.`user_id`,
`app_identifier`.`key`, `app_identifier`.`value` FROM
`app_identifier` WHERE (`app_identifier`.`key` = a OR
`app_identifier`.`key` = b )
>>>
Заметьте, что это не помещает кавычки вокруг "a" или "b"! Теперь, я решил, что запрос выполняется прекрасный. Так, в действительности это должно делать так. Но, это является довольно раздражающим, что распечатывание запроса печатает его неправильно. Особенно, если я сделал что-то вроде этого...
>>> qs = Identifier.objects.filter(Q(key=") AND") | Q(key="\"x\"); DROP TABLE
`app_identifier`"))
>>> print qs.query
SELECT `app_identifier`.`id`, `app_identifier`.`user_id`,
`app_identifier`.`key`, `app_identifier`.`value` FROM
`app_identifier` WHERE (`app_identifier`.`key` = ) AND OR
`app_identifier`.`key` = "x"); DROP TABLE `app_identifier` )
>>>
Который, как Вы видите, не только, создает абсолютно уродливый код SQL, но также и имеет семена атаки с использованием кода на SQL. Теперь, очевидно, это на самом деле не работало бы для множества причин (1. Синтаксис неправилен, намеренно, для показа причуды поведения Django. 2. Django на самом деле не выполнит запрос как это, он на самом деле поместит кавычки и наклонные черты и все, которое там как он предполагается к).
Но, это действительно делает отладку сбивающего с толку, и она заставляет меня задаться вопросом, пошло ли что-то не так, как надо с моей установкой Django.
Это происходит для Вас? Если так/не, какую версию Python и Django Вы имеете?
Какие-либо мысли?
Хорошо, я только что понял. Это не ошибка. Просмотр источника django / db / models / sql / query.py:
160 def __str__(self):
161 """
162 Returns the query as a string of SQL with the parameter values
163 substituted in.
164
165 Parameter values won't necessarily be quoted correctly, since that is
166 done by the database interface at execution time.
167 """
168 sql, params = self.get_compiler(DEFAULT_DB_ALIAS).as_sql()
169 return sql % params
( http://code.djangoproject.com/browser/django/trunk/django/db/models/sql/query.py )
Все работает нормально. :)