我有一些格式的发布数据
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
}
我在这里想要实现的是,我从每个过滤器字典的键“类型”中选择每个过滤器类型的值。我将其余所有字段作为 kwargs 发送,并将直接传递到我附加这些过滤器的查询。
因此,这是将根据我通过的过滤器数量附加的查询:
s = Search(using=es).index(settings.ES_INDEX).doc_type(model)
这是默认的elasticsearch,就像我的数据库上的所有匹配查询。
当我通过上述过滤器(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 以便我可以将所有内容直接解压到查询中?
最佳答案
您可以通过从字典中提取 type
键并将其余部分应用到 F()
过滤器对象来动态构建多个过滤器。 S.filter()
返回更新的搜索,因此只需继续将下一个过滤器应用到循环中的对象即可:
for filter in d['filters']:
type_ = filter.pop('type')
s = s.filter(type_, **filter)
关于python - 在 Python 中将 JSON 参数作为 kwargs 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27421773/