python - django filter when the some of the arguments are null -


i'm using django filter queryset want,here code:

             students = student.objects.filter(                 sales=current_user,                 nickname = form_data['nickname'],                 mobile = form_data['mobile'],                 gender = form_data['gender'],                 state = form_data['state'],                 source = form_data['source'],                 register_at = form_data['register_at'],                 importance = form_data['importance'],                 remaining = form_data['remaining'],                 level = form_data['level'],                 feature = form_data['feature'],                 company_name = form_data['company']             ).order_by(register_order, remaining_order, level_order) 

now question :some of form data fields may null, cause forms input user, , he/she can choose input fields, wonder if code work when fields null, if not, how rewrite queryset based on fields user inputs?

the logic this:

# start students = student.objects.filter(sales=current_user)  value = form.cleaned_data.get('nickname', none) if value not none:     students = students.filter(nickname=value)  # etc, etc ...  # end students = students.order_by(register_order, remaining_order, level_order) 

but of course, ugly considering how many fields have. instead, have this:

students = student.objects.filter(sales=current_user)      fields = ['nickname', 'mobile', 'gender', ....] field in fields:     value = form.cleaned_data.get(field, none)     if value not none:         students = students.filter(**{field: value})      students = students.order_by(register_order, remaining_order, level_order) 

or, using all fields of form:

students = student.objects.filter(sales=current_user)      key, value in form.cleaned_data.items():     if value not none:         students = students.filter(**{key: value})      students = students.order_by(register_order, remaining_order, level_order) 

note we're testing if value not none instead of if value, allow '0' values pass test.


Comments