2017-04-02 117 views
0

我正在Django上创建一个搜索页面,并且想要生成一个动态查询集。如何在Python中的另一个列表中填充列表循环?

我有串过滤器的列表initiaized这样的:

filter_names = ('filter1', 'filter2')

的话,我想在我的filter_names列表循环,并提出附带请求中的每个滤波器的Q对象的列表(在filter_names中使用相同的名称)。我创建Q的名单如下:

filter_clauses = [Q(filter=request.GET.get(filter)) 
         for filter in filter_names 
         if request.GET.get(filter)] 

问题是结果的列表(filter_clauses)是一样的东西:

Q(filter=value1), 
Q(filter=value2) 

但其实我是想像一个列表:

Q(filter1=value1), 
Q(filter2=value2) 

实际上,循环没有捕获变量过滤器的值,而是将其解释为“过滤器”。

那么,我在循环中做了什么错误?

欲了解更多信息,我把这个想法从这个answer,而且我得到这个错误:

Cannot resolve keyword 'filter' into field.

,这意味着,该框架在名为“搜索模式搜索字段过滤器“,并显然没有找到它。

回答

2

您可以使用关键字参数拆包:

filter_clauses = [Q(**{filter: request.GET.get(filter)}) 
         for filter in filter_names 
         if request.GET.get(filter)] 

这里filter在字典中的关键,所以,当你解压的参数,参数名称将是filter1