0

I'm now using django filter to get the queryset I want,here is my 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 the question is :some of my form data fields may be null, cause the forms are input by the user, and he/she can choose to just input some fields, I wonder if this code could work when some fields are null, if not, how to rewrite it to get the queryset based on the fields user inputs?

jpic
  • 32,891
  • 5
  • 112
  • 113
Roger Liu
  • 1,768
  • 3
  • 16
  • 25

1 Answers1

3

The logic could be like this:

# start with this
students = Student.objects.filter(sales=current_user)

value = form.cleaned_data.get('nickname', None)
if value is not None:
    students = students.filter(nickname=value)

# etc, etc ...

# end with that
students = students.order_by(register_order, remaining_order, level_order)

But of course, this would be ugly considering how many fields you have. Instead, you could have something like this:

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

Or, using all fields of the form:

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

Note that we're testing if value is not None instead of just if value, this is to allow '0' values to pass the test.

jpic
  • 32,891
  • 5
  • 112
  • 113