モデルから辞書への変換を支援するPythonモジュールを公開しました。
bpmappers 0.8.2 : Python Package Index
tokibito / python-bpmappers — Bitbucket
ビープラウドで使っているものです。
JSONのAPIを作るときなどに、ツリー構造の辞書オブジェクトから変換したりしますが、その辞書の生成などで役に立ちます。
サンプルコードを以下に。
test.py
from bpmappers import Mapper, RawField, ListDelegateField class Person(object): def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return '<Person name:%s, age:%d>' % (self.name, self.age) class Group(object): def __init__(self, name): self.name = name self.people = [] def __repr__(self): return '<Group name:%s, people:%s>' % (self.name, self.people) class PersonMapper(Mapper): name = RawField() age = RawField() class GroupMapper(Mapper): name = RawField() people = ListDelegateField(PersonMapper) def main(): hoge = Person('hoge', 17) fuga = Person('fuga', 19) foo = Group('foo group') foo.people.extend([hoge, fuga]) print foo print GroupMapper(foo).as_dict() if __name__ == '__main__': main()
GroupがPersonを複数持っているというよくあるパターンです。これを実行した場合、出力は次の通りになります。
$ python test.py <Group name:foo group, people:[<Person name:hoge, age:17>, <Person name:fuga, age:19>]> {'name': 'foo group', 'people': [{'age': 17, 'name': 'hoge'}, {'age': 19, 'name': 'fuga'}]}
辞書オブジェクトを作る際のデータのマッピングをMapperクラスを継承したクラスで定義しています。
この場合は特にヒネリもないので記述は短いですが、元のモデルの定義が複雑だったり出力する辞書の構造と全然合わない場合などには、結構強力だったりします。
あ、Djangoのモデルのメタ情報からMapperクラスを生成する機能もあるよ。