2015-01-24 1 views
3

Я хочу фильтровать данные на основе нескольких полей в Django python.
Сценарий: если запрос GET на веб-сервер приходит как /searchStudent/?firstName=&lastName=xyzage=23&class=&city=, и мы не знаем, что может быть возможным параметром в строке запроса, некоторые из них могут иметь значение, а какая-то переменная doesnot поставляется со значением. Вопрос в том, есть ли какой-либо, чтобы получить переменную, которая имеет только значение или которые не имеют значений из запроса. Я знаю, что мы можем просто получить значение, используя request.GET.get('city'), но я нахожу способ получить ненулевую переменную из строки запроса, есть ли способ найти переменную non value из строки запроса? В приведенном выше сценарии city, class, and firstName не имеет значений, и я не хочу добавлять его в фильтр. какой будет правильный подход? пожалуйста, предложите правильный путь.Как найти ненулевые переменные из строки запроса URL? или мы можем получить переменную в строке запроса URL-адреса из запроса в python

ответ

4

Чтобы получить ДИКТ непустых параметров запроса используйте этот код:

non_empty_params = dict((field, value) 
         for field, value in request.GET.iteritems() if value) 

Но не строят QuerySet таким образом. Вы никогда не должны доверять данным из пользовательского ввода. Таким образом, вы должны иметь список полей для поиска и использовать этот список, чтобы отфильтровать неправильные имена полей:

fields = ('firstName', 'lastName', 'age', 'class', 'city',) 
filter_params = dict((field, value) 
         for field, value in request.GET.iteritems() 
         if value and field in fields) 
students = Student.objects.filter(**filter_params) 
+0

Спасибо, я получил концепцию – MegaBytes

4

Я так и я получаю ответ для фильтрации динамически

filter_args={} 
if request.GET.get('firstName') : 
    filter_args['firstName']=request.GET.get('firstName') 
if request.GET.get('lastName') : 
    filter_args['lastName']=request.GET.get('lastName') 
if request.GET.get('city') : 
    filter_args['city']=request.GET.get('city') 
Student.object.filter(**filter_args) 

Это знаю как динамические запросы, я не знал об этом. Спасибо @catavaran, за предложение концепции.
также ссылается на эту ссылку Dynamic Django Queries

+1

Не сравнивайте параметры запроса с пустой строкой. В случае отсутствия параметра 'request.GET.get ('firstName')' будет возвращать 'None', который не равен' '' '. Вы должны передать второй аргумент методу 'get()': 'request.GET.get ('firstName', '')'. Или принудительный результат 'get()' для boolean: 'if request.GET.get ('firstName'):' – catavaran

+0

@catavaran, спасибо, я снова понял концепцию, я новичок в python, поэтому я я не знаю, так много всего, это мой учебный момент. Еще раз спасибо – MegaBytes

+5

@catavaran, Когда я пробовал с
'filter_args = {} , если request.GET.get ('firstName') не является None: filter_args ['firstName'] = request.GET.get ('firstName') , если request.GET.get ('lastName') не является None: filter_args ['lastName'] = request.GET.get ('lastName') если request.GET.get ('city') не является None : filter_args ['city'] = request.GET.get ('city') ' Значения в' filter_args' являются '{'firstName': u '', 'lastName': u'xyz ',' city ': u' '} ' он выдавал исключение ' ValueError at/searchStudent/ Неверный литерал для int() с базой 10:' '', поэтому я попытался сделать это выше. – MegaBytes