如何在where子句中添加更多条件?

时间:2013-10-14 15:59:42

标签: django django-queryset

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

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'子句?

2 个答案:

答案 0 :(得分: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)

你可以read more about Q object in Django docs

答案 1 :(得分:0)

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

' and level_concat like %%'+level+'%%'