基于可选参数的Django过滤

Dja*_*oob 5 python django django-queryset

我有一个可选参数列表,我用于在Django中过滤,并尝试提出应用这些过滤器的最佳解决方案.我的第一个想法是做一些像:

if param_1 != 'all' and param_2 != 'all': # etc.
    class_var = ClassName.objects.filter(param_1__name=param_1, param_2__name=param_2) # etc.
else:
    class_var = ClassName.objects.all()
Run Code Online (Sandbox Code Playgroud)

但由于参数都是可选的,我可能只想基于它进行过滤,param_1并将其余部分设置为'all'.当然另一种选择是说:

class_var = ClassNam.objects.all()
if param_1 != 'all':
    class_var.filter(param_1__name=param_1)

if param_2 != 'all':
    class_var.filter(param_2__name=param_2)

# etc.
Run Code Online (Sandbox Code Playgroud)

但在我看来,这似乎并没有真正有效.我只是希望得到一些关于我可能能够执行这些选项过滤器的方法的想法.

Bas*_*lex 8

你实际上可以做什么

from django.db.models import Q

q = Q()
if param_1 != 'all':
    q &= Q(param_1__name=param_1)

if param_2 != 'all':
    q &= Q(param_2__name=param_2)

class_var = ClassName.objects.filter(q)

OR

q = {}
if param_1 != 'all':
    q.update({'param_1__name': param_1})

if param_2 != 'all':
    q.update({'param_2__name': param_2})

class_var = ClassName.objects.filter(**q)
Run Code Online (Sandbox Code Playgroud)


eyk*_*nal 6

您可能想要查看Q对象。简而言之,Q您可以OR在查询中使用语句。从前面链接的页面:

Polls.objects.get(
    Q(question__startswith='Who') | Q(question__startswith='What')
)
Run Code Online (Sandbox Code Playgroud)

这将提出以“谁”或“什么”开头的问题。