0

我做了一个循环来检索条件:

for level in levels:
    requete += ' and level_concat like %'+level+'%'

我在我的查询中提出:

countries = Country.objects.extra(where=['continent_id = "'+continent_id+'"', requete])

我试图在 where 子句中添加条件,但返回错误:

not enough arguments for format string

尊重的结果:

SELECT * FROM `Country` WHERE country_id = "US-51" AND level_concat LIKE %level_test%

有没有办法添加requete到我的“where”子句中?

4

2 回答 2

1

首先,将关系数据库中的数据保存为“由逗号连接的 [值] 列表”不是一个好习惯——您应该为这些值创建一个新表。

尽管如此,即使现在您也可以使用filter(), 而不是extra()(这应该始终是您最后的手段 - 我看不到您的其余代码,但如果您没有正确转义levels值,您甚至可能会在此处引入 SQL 注入漏洞) .

一个安全的、extra()更少的代码的例子,它做同样的事情:

from django.db.models import Q

q = Q()
for level in levels:
    q &= Q(level_concat__contains=level)

countries = Country.objects.filter(q)

或相同的功能,但行数更少:

from django.db.models import Q

q = (Q(level_concat__contains=l) for l in levels)
countries = Country.objects.filter(*q)

您可以在 Django 文档中阅读有关 Q 对象的更多信息

于 2013-10-14T18:17:27.670 回答
0

我认为您需要转义%查询中的符号:

' and level_concat like %%'+level+'%%'
于 2013-10-14T16:21:21.510 回答