使用Django创建查询

时间:2016-10-11 20:31:11

标签: python django

大家好我,我试着用params传递一个查询,在我的情况下,uRL就像

http://127.0.0.1:8000/api/cpuProjects/cpp/es
http://127.0.0.1:8000/api/cpuProjects/cpp,ad/es

我创建查询的代码就像这样

def findElem(request, **kwargs):
  projects_name = str(kwargs['project_name']).split(',')
  status = str(kwargs['status'])
  list_project = tuple(projects_name)
  print(list_project)
  query = "SELECT * FROM proj_cpus WHERE project in '%s'"  % projects_name
  print(query)
  result = run_query(query)

首先返回此查询

SELECT * FROM proj_cpus WHERE project in '['cpp']'

第二个必须通过像这样的查询

SELECT * FROM proj_cpus WHERE project in '['cpp', 'ad']'

在这种情况下,当我执行查询时返回我的语法错误,是的,我知道[]不正确

所以我在一个元组中转换我的参数 所以现在查询就像那样

,错误是

SELECT * FROM proj_cpus WHERE project in ('cpp')
SELECT * FROM proj_cpus WHERE project in ('cpp', 'ad')

not all arguments converted during string formatting

创建查询的最佳方法是什么?

提前致谢

2 个答案:

答案 0 :(得分:2)

我很遗憾地说,但是将变量直接传递给查询在每种语言中都是危险的。尝试更像这样的东西。 Django会照顾你正确地逃避你的论点,否则你会得到SQL注入的可能性:

from foo.models import CPUSModel

projects_name = ... whatever you did to get a tuple ...

results = CPUSModel.objects.raw('SELECT * FROM proj_cpus WHERE project in %s', [tuple(projects_name),])
list(results)

有关django原始查询的更多问题,您可以查看https://docs.djangoproject.com/en/1.10/topics/db/sql/

答案 1 :(得分:1)

最好的办法是使用Django的ORM API进行查询:

from foo.models import ProjCpu
...
projects_name = ...
...
ProjCpu.objects.filter(project__in=projects_name)

您可以在Django文档中阅读有关它的所有内容。

基本上你只需要知道,但如果你想了解更多关于你所得到的错误,欢迎你继续阅读。

您遇到的错误是由错误使用字符串格式引起的。 要将多个参数传递给字符串格式,请使用元组,如下所示:

print("the %s, the %s and the %s" % ("good", "bad", "ugly"))

由于你为字符串格式提供了一个元组,python试图将元组中的项格式化为单独的多个参数。因为你只指定了一个"%s"在字符串中,出现了错误。

为了提供一个元组作为唯一参数,你必须把它作为另一个元组的唯一成员:

my_tuple = (1, 2, 3)
print("tuple: %s" % (my_tuple,))

或只使用.format

print("tuple: {}".format(my_tuple))

在您的情况下,执行query = "SELECT * FROM proj_cpus WHERE project in '%s'" % (projects_name,)将不再引发错误。但如前所述,只需使用Django的ORM进行查询。