Python 当某些参数为空时,django筛选器

Python 当某些参数为空时,django筛选器,python,django,filter,Python,Django,Filter,我现在使用django过滤器获取我想要的查询集,下面是我的代码: students = Student.objects.filter( sales=current_user, nickname = form_data['nickname'], mobile = form_data['mobile'], gender = form_data['g

我现在使用django过滤器获取我想要的查询集,下面是我的代码:

             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)

现在的问题是:我的一些表单数据字段可能是空的,因为表单是由用户输入的,他/她可以选择只输入一些字段,我想知道当一些字段为空时,这段代码是否可以工作,如果不能,如何重写它以根据用户输入的字段获得查询集?

逻辑可能是这样的:

# 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)
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)
但当然,考虑到你有多少领域,这将是丑陋的。相反,您可以有如下内容:

# 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)
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)
或者,使用表单的所有字段:

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)

请注意,我们正在测试
if value不是None
而不是
if value
,这是为了允许“0”值通过测试。

逻辑可能如下所示:

# 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)
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)
但当然,考虑到你有多少领域,这将是丑陋的。相反,您可以有如下内容:

# 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)
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)
或者,使用表单的所有字段:

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)

请注意,我们正在测试
如果值不是None
而不是
如果值
,这是为了允许“0”值通过测试。

您不应该使用
表单数据
,而应该使用
表单。清理的表单数据
来获取有效数据。可能与我没有粘贴表单数据=某些表单(request.get)重复,我在列表视图中的get_queryset中执行此查询。恐怕情况不同form=some_form(request.get),form_data=form.cleaned_data,对不起,您不应该使用
form_data
,而应该使用
form.cleaned_data
来获取有效数据。可能与我没有粘贴form_data=some_form(request.get)是重复的,我在列表视图的get_queryset中进行此查询,恐怕不是同一个caseform=some_form(request.get),form_data=form.cleaned_data,对不起谢谢你的回答,我选择了第三种方式:)谢谢你的回答,我选择了第三种方式:)