Python 使用Django创建查询

Python 使用Django创建查询,python,django,Python,Django,大家好,我尝试用params pass-by URL进行查询,在我的例子中,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 =

大家好,我尝试用params pass-by URL进行查询,在我的例子中,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
创建查询的最佳方式是什么


提前感谢

很抱歉这么说,但是在每种语言中,将变量直接传递到查询中都是危险的。试试这样的。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原始查询的更多问题,请检查

很抱歉这么说,但是在每种语言中,将变量直接传递到查询中都是危险的。试试这样的。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原始查询的更多问题,请查看

最好使用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=“从项目CPU中选择*,其中“%s”(项目名称)中的项目将不再引发错误。但如前所述,只需使用Django的ORM进行查询。

最好的方法是使用Django的ORMAPI进行查询:

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=“从项目CPU中选择*,其中“%s”(项目名称)中的项目将不再引发错误。但如前所述,只需使用Django的ORM进行查询。

我甚至坚持您使用ORM,因为Django有一个非常高效的内置ORM系统。这很危险。我甚至坚持你使用ORM,因为Django有一个非常高效的内置ORM系统。这很危险。谢谢@yonizzz的请求,但就我而言,我不知道如何使用Django的ORM进行查询,我查阅了外部数据库,以在模板中显示数据,但我不需要将这些数据保存在我自己的数据库中。谢谢@yonizzz的请求,但就我而言,我不知道如何使用Django的ORM进行查询,我查阅了外部数据库,在模板中显示数据,但我不需要将此数据保存在自己的数据库中