繁体   English   中英

当一些参数为null时,django过滤

[英]django filter when the some of the arguments are null

我现在使用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)

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

逻辑可能是这样的:

# 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 is not None而不仅仅是if value ,这是为了允许'0'值通过测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM