2013-10-14 6 views
0

я сделал петлю, чтобы получить условие:Как добавить дополнительные условия в where clause?

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

и я сделал в моем запросе:

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

Я попытался добавить условие к моему где положению, но возвращать ошибку:

not enough arguments for format string 

Уважаемые результаты:

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

Есть ли способ добавить requete в мое предложение «где»?

+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 Injection).

Пример безопасного, 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.

Смежные вопросы