我是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”)对相同的查询数据执行多次。
答案 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)
这应该有效,因为:
Django ORM过滤器可以接受过滤条件作为dict,键作为条件,值作为过滤值。
空dict就像没有过滤任何东西,意味着返回一切。