2

次の辞書の filter[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'}
]

最初の辞書は、extjs グリッド フィルター プラグインの GET 要求から渡された Pylons からのものです。

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リストとdictに変換する方法がわかりません。

クエリのフィルターの量を事前に知らないため、作成された辞書のリストを使用して、リストをループし、SQL クエリを自動生成できます。(これを行うためのより良い方法があるかもしれませんが?)

4

1 に答える 1

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}]
于 2013-03-09T20:32:38.980 に答える