如何在不知道某些过滤器是否为空的情况下在 Django 查询中应用多个过滤器
How to apply multiple filters in a Django query without knowing if some filters are null or not
假设我们有以下过滤器:
filter1 = request.GET.get("blabla")
filter2 = request.GET.get("blabla")
filter3 = request.GET.get("blabla")
filter4 = request.GET.get("blabla")
filter5 = request.GET.get("blabla")
filter6 = request.GET.get("blabla")
假设我们有以下查询:
user_projects = Project.objects.filter(element1=filter1, element2=filter2, element3=filter3, element4=filter4, element5=filter5, element6=filter6).distinct().values("id", "name", "customer_id", "dev_status", "manager_id", "total_billable")
一些过滤器可能是 None
类型(取决于请求)
我想创建一个基于过滤器是否存在的动态查询,仅使用非空过滤器执行查询。
例如,过滤器 1、2 和 3 有值,但过滤器 4、5 和 6 是 empty/null/None。
预期查询:
user_projects = Project.objects.filter(element1=filter1, element2=filter2, element3=filter3).distinct().values("id", "name", "customer_id", "dev_status", "manager_id", "total_billable")
我尝试过的:
if filter1 is None or filter1.strip() == "":
filter1 = ""
elif is_valid_queryparam(filter1):
user_projects = Project.objects.filter(element1=filter1).distinct().values("id", "name", "customer_id", "dev_status", "manager_id", "total_billable")
它有效,但仅适用于一个过滤器,如果我想要 6 or N
个过滤器,执行多个查询效率极低。
是否可以通过简单的查询获得想要的结果?
您可以制作一个实用方法,例如:
filter_qs_if_not_None(qs, **kwargs):
return qs.filter(
**{key: value for key, value in kwargs.items() <strong>if value is not None and value.strip()</strong>}
)
然后我们可以过滤:
user_projects = <strong>filter_qs_if_not_None(</strong>
Project.objects.all(),
element1=filter1,
element2=filter2,
element3=filter3,
element4=filter4,
element5=filter5,
element6=filter6
<strong>)</strong>
假设我们有以下过滤器:
filter1 = request.GET.get("blabla")
filter2 = request.GET.get("blabla")
filter3 = request.GET.get("blabla")
filter4 = request.GET.get("blabla")
filter5 = request.GET.get("blabla")
filter6 = request.GET.get("blabla")
假设我们有以下查询:
user_projects = Project.objects.filter(element1=filter1, element2=filter2, element3=filter3, element4=filter4, element5=filter5, element6=filter6).distinct().values("id", "name", "customer_id", "dev_status", "manager_id", "total_billable")
一些过滤器可能是 None
类型(取决于请求)
我想创建一个基于过滤器是否存在的动态查询,仅使用非空过滤器执行查询。
例如,过滤器 1、2 和 3 有值,但过滤器 4、5 和 6 是 empty/null/None。
预期查询:
user_projects = Project.objects.filter(element1=filter1, element2=filter2, element3=filter3).distinct().values("id", "name", "customer_id", "dev_status", "manager_id", "total_billable")
我尝试过的:
if filter1 is None or filter1.strip() == "":
filter1 = ""
elif is_valid_queryparam(filter1):
user_projects = Project.objects.filter(element1=filter1).distinct().values("id", "name", "customer_id", "dev_status", "manager_id", "total_billable")
它有效,但仅适用于一个过滤器,如果我想要 6 or N
个过滤器,执行多个查询效率极低。
是否可以通过简单的查询获得想要的结果?
您可以制作一个实用方法,例如:
filter_qs_if_not_None(qs, **kwargs):
return qs.filter(
**{key: value for key, value in kwargs.items() <strong>if value is not None and value.strip()</strong>}
)
然后我们可以过滤:
user_projects = <strong>filter_qs_if_not_None(</strong>
Project.objects.all(),
element1=filter1,
element2=filter2,
element3=filter3,
element4=filter4,
element5=filter5,
element6=filter6
<strong>)</strong>