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

时间:2014-12-11 11:27:55

标签: 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
}

我在这里尝试实现的是从每个过滤器字典的键“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,以便我可以直接将所有内容解压缩到查询中?

1 个答案:

答案 0 :(得分:1)

您可以通过从字典中提取type键并将余数应用于F()过滤器对象来动态构建多个过滤器。 S.filter()返回更新的搜索,因此只需继续将下一个过滤器应用于循环中的对象:

for filter in d['filters']:
    type_ = filter.pop('type')
    s = s.filter(type_, **filter)