python - 在 Python 中将 JSON 参数作为 kwargs 传递

标签 python json elasticsearch

我有一些格式的发布数据

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/

相关文章:

json - 如何使用包含已编码值的 Encodable 在 Swift 中对结构进行编码

javascript - 带有多个文件夹的 Angular-Translate Partial

php - 在Windows上安装elasticsearch

elasticsearch - 在ElasticSearch中如何过滤某些单词的结果集?

python - 如何比较 itertools.combinations 中的元素?

python - 为什么有一个以 an_arg_name 和 *args 作为参数的函数而不是仅 *args

python - 如何拆分大小大于可用内存的文件?

javascript - 将JSON中的字符串js函数解析为js函数

elasticsearch - Elasticsearch-在每次搜索中增强特定文档

python - 在 PyQt5 中安装 EventFilter