Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QuerySet.query中潜在的Django错误?_Python_Django - Fatal编程技术网

Python QuerySet.query中潜在的Django错误?

Python QuerySet.query中潜在的Django错误?,python,django,Python,Django,免责声明:我仍在学习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 `

免责声明:我仍在学习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
()


一切正常

您是否尝试过
qs.query.as_sql()
?据我所知,QuerySet.query.as_sql()在1.2.1之前的某些Django版本中不再起作用。我是使用1.2.1进入Django世界的,所以我不知道全部细节,但在我对这个主题的研究中,我发现了这一点。“print qs.query.as_sql()”在我的安装中导致“AttributeError:'query'对象没有属性'as_sql'”。这是一个很好的问题和答案(在与Django合作一年多后,我不知道这一点)。这是一件我有一段时间一直在怀疑的事情,但我只是觉得我错过了一些东西。现在我知道了。谢谢