首页 > 解决方案 > 如何在 django 中应用包含字符串和列表值的 dict 中的过滤器?

问题描述

我有 dict - 像这样的过滤器:

    "filter1": "string",
    "filter2": [
      "A","B"
    ],
    "filter3": "string",
    "filter4": [
      "C","D"
    ],
  }

其中 filter1,filter2,filter3 filter4 是我模型中的一些字段。

query_set = query_set.filter(**filters)适用于所有类型不是列表的过滤器,

但我想尽可能干净地过滤 query_set,如何使用包含字符串和列表值的 dict 应用过滤器?

PS:我知道 __in 并且知道我可以做类似的事情

filter2_list = filters.get(filter2) 
if filter2_list:
   query_set = query_set.filter(filter2__in=filter2_list)

但是,1. 我不想使用 if-else 语句 2. 我想在过滤器参数中有动态变量,而不是像 filter2__in 这样的核心变量

标签: pythondjangosearchfilterdjango-queryset

解决方案


好吧,无论如何这都不是一种非常干净的方式,但是您只需遍历过滤器一次,检查它是否是列表即可逃脱。

new_filters = {}
for key,value in f.items():
     new_filters[f"{key}__in" if isinstance(value,list) else key] = value
query_set = query_set.filter(**new_filters)

推荐阅读