将过滤器[X] ...以下字典的键/值自动转换为(嵌套)词典列表的最简单方法是什么。
{'filter[0][data][type]': u'string',
'filter[0][data][value]': u'T',
'filter[0][field]': u'company',
'filter[1][data][comparison]': u'lt',
'filter[1][data][type]': u'numeric',
'filter[1][data][value]': u'100',
'filter[1][field]': u'price',
'filter[2][data][comparison]': u'gt',
'filter[2][data][type]': u'numeric',
'filter[2][data][value]': u'10',
'filter[2][field]': u'price',
'limit': u'10',
'page': u'1',
'sort': u'[{"property":"company","direction":"ASC"}]',
'start': u'0'}
我想要的结果如下:
[
{'data': {'type': 'string', 'value': 'T'}, 'field': 'company'},
{'data': {'comparison': 'lt', 'type': 'numeric', 'value': 100},
'field': 'price'},
{'data': {'comparison': 'gt', 'type': 'numeric', 'value': 10},
'field': 'price'}
]
最初的dictonary来自Pylons从extjs网格过滤器插件GET请求传递
在extjs网格过滤器中还有一个选项可以对过滤器json进行编码,所以最终得到:
{ 'filter': u'[{"type":"string","value":"T","field":"company"},{"type":"numeric","comparison":"lt","value":100,"field":"price"},{"type":"numeric","comparison":"gt","value":10,"field":"price"}]',
'limit': u'10',
'page': u'1',
'sort': u'[{"property":"company","direction":"ASC"}]',
'start': u'0'}
但我又不知道如何将此自动转换为python list和dict。
我事先并不知道查询的过滤器数量,所以使用创建的词典列表,我可以循环遍历列表并自动生成sql查询。 (虽然也许有更好的方法可以做到这一点?)
答案 0 :(得分:0)
找到解决方案:将过滤器作为json编码传递,然后只需使用json.loads(),我就会得到一个字典列表。
>>> import json
>>> dict = {'filter': u'[{"type":"string","value":"T","field":"company"},{"type":"numeric","comparison":"lt","value":100,"field":"price"},{"type":"numeric","comparison":"gt","value":10,"field":"price"}]',
'limit': u'10',
'page': u'1',
'sort': u'[{"property":"company","direction":"ASC"}]',
'start': u'0'}
>>> json.loads(dict['filter'])
[{u'field': u'company', u'type': u'string', u'value': u'T'},
{u'comparison': u'lt',
u'field': u'price',
u'type': u'numeric',
u'value': 100},
{u'comparison': u'gt', u'field': u'price', u'type': u'numeric', u'value': 10}]