我有一些格式
的帖子数据d = {
"filters": [
{
"type": "range",
"question__created_at": "2014-11-10T11:11:55.027Z",
"exclude_filter": False,
},
{
"type": "terms",
"question_name": ["AB","CD"]
"exclude_filter": False,
}
],
"count": True
}
我在这里尝试实现的是从每个过滤器字典的键“type”中选择每种过滤器类型的值。我将其余所有字段作为kwargs发送,并将直接传递给我追加这些过滤器的查询。
所以这里是根据我传递的过滤器数量附加的查询:
s = Search(using=es).index(settings.ES_INDEX).doc_type(model)
这是默认的弹性搜索,就像我的数据库上的所有查询匹配一样。
当我传递上面的过滤器(JSON)时,在这种情况下,当我传递了2个过滤器时,下面是我修改后的查询应该是这样的:
s = Search(using=es).index(settings.ES_INDEX).doc_type(model)
s = s.filter(
F('range', question__created_at="2014-11-10T11:11:55.027Z", exclude_filter=True) &
F('terms', question_name=["AB","CD"], exclude_filter=True))
因此,根据传递的任何数量的过滤器,它应该动态地继续使用“s”对象附加它们
任何人都可以帮我解决如何在python中编写一个函数,它将过滤器类型分开并将其余部分作为kwargs,以便我可以直接将所有内容解压缩到查询中?
答案 0 :(得分:1)
您可以通过从字典中提取type
键并将余数应用于F()
过滤器对象来动态构建多个过滤器。 S.filter()
返回更新的搜索,因此只需继续将下一个过滤器应用于循环中的对象:
for filter in d['filters']:
type_ = filter.pop('type')
s = s.filter(type_, **filter)