2013-10-14 82 views
0

我做了一個循環檢索條件:如何在where子句中添加更多條件?

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

+1

您使用'.extra'而不是'.filter'的任何特定原因? –

+0

,因爲'level_concat'是由昏迷連接的級別列表,'requete'還包含一個級別列表。那麼怎麼用'.filter'做到這一點 – Drwhite

+0

我不知道你的列表結構是什麼。但無論如何,我認爲你需要在查詢中將'%'符號轉義爲'%%'所以''和level_concat像%'+ level +'%''應該是''和level_concat像%%'+ level +'%% 「' –

回答

0

我認爲你需要躲避%登錄查詢:

' and level_concat like %%'+level+'%%' 
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