基于局部变量的Django条件过滤器

时间:2016-08-04 17:46:51

标签: python django filter

我是django的新手,并且想知道除了if语句之外是否有更有效的方法来有条件地过滤。

假设:

test_names = ["all"]
test_types = ["a", "b", "c"]
... (more lists)

我知道我可以这样做:

q = tests.objects.all()

if test_names[0] == "all":
    q = q.all()
else:
    q = q.filter("name__in=test_names")

if test_types[0] == "all":
    q = q.all()
else:
    q = q.filter("type__in=test_type")

etc...

我想要这样的事情:

q = test.objects \
        .filter((if test_names[0]=="all") "name__in=test_names") \
        .filter((if test_types[0]=="all") "type__in=test_types") \
        ...etc

我想避免使用if语句,因为我必须根据不同的列表(例如“test_names”)对相同的查询数据执行多次。

1 个答案:

答案 0 :(得分:0)

您的列表中有条件,因此您需要if来确定不同的条件。您可以使用一个查询语句,但需要处理列表:

test_name_filter = {} if test_names[0] == 'all' else {'name__in': test_names}
test_type_filter = {} if test_type[0] == 'all' else {'type__in': test_types}
# ......
q = test.objects.filter(**test_name_filter).filter(**test_type_filter)

这应该有效,因为:

  1. Django ORM过滤器可以接受过滤条件作为dict,键作为条件,值作为过滤值。

  2. 空dict就像没有过滤任何东西,意味着返回一切。