我正在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”,但很可能找不到它。
答案 0 :(得分:2)
您可以使用关键字参数解包:
filter_clauses = [Q(**{filter: request.GET.get(filter)})
for filter in filter_names
if request.GET.get(filter)]
此处filter
的值是字典中的键,因此当您解压缩参数时,参数名称将为filter1
等。