如何在Python中的另一个列表中填充循环列表?

时间:2017-04-02 17:21:46

标签: python django list foreach request

我正在Django上创建一个搜索页面,并希望生成一个动态查询集。

我有一个像这样初始化的字符串过滤器列表:

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中提出了这个想法,我收到了这个错误:

  

无法将关键字“过滤器”解析为字段。

这意味着,框架正在搜索模型中的字段,其名称为“filter”,但很可能找不到它。

1 个答案:

答案 0 :(得分:2)

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

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

此处filter是字典中的键,因此当您解压缩参数时,参数名称将为filter1等。