基于可选参数的Django过滤

时间:2015-05-29 20:42:39

标签: 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()

但由于参数都是可选的,我可能只想根据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.

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

4 个答案:

答案 0 :(得分:6)

你实际可以做什么

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)

答案 1 :(得分:2)

您可能需要查看Q objects。简而言之,Q允许您在查询中使用OR语句。从上面的链接页面:

Polls.objects.get(
    Q(question__startswith='Who') | Q(question__startswith='What')
)

这将从" Who"开始提出问题。或者"什么"。

答案 2 :(得分:1)

使用Q对象制作查询列表。

q=[]
if param_1 != 'all':
   q.append(Q(param_1__name=param_1))
if param_2 != 'all':
   q.append(Q(param_2__name=param_2))

details = ClassName.objects.filter(reduce(AND, q))

答案 3 :(得分:0)

查询集很懒惰。在评估查询集之前,通常不会通过迭代来进行数据库查询。您可以免费使用任意数量的过滤器,而且几乎不需要任何费用。

一个注意事项:filter()不会更改查询集,而是返回一个新的查询集。应用其他过滤器的正确方法是:

class_var = class_var.filter(param_1__name=param_1)