2012-02-22 7 views
5

Djangoを使用してバックエンドWebサービスを作成して、&を作成してJSONを消費し、同僚がExtJS4フロントエンドで作業しています。私はwadofstuffシリアライザを使用しているので、ネストされたオブジェクトをシリアル化できます。「フィールド」フィールドなしでオブジェクトをシリアル化するDjangoを取得する

私の同僚はjsonの解析に問題があります。具体的には、Djangoはオブジェクトのフィールドを「フィールド」フィールドに置きます。短い例:

{ 
    "pk":1, 
    "model":"events.phone", 
    "fields":{ 
    "person":1, 
    "name":"Cell", 
    "number":"444-555-6666" 
    } 
} 

私はExtJSのと私の仲間の開発者を幸せにするためにそれらをシリアル化したい方法を:

{ 
    "pk":1, 
    "model":"events.phone", 
    "person":1, 
    "name":"Cell", 
    "number":"444-555-6666" 
} 

我々が必要とするものが今連載されている

方法しかしこれよりはるかに複雑なオブジェクトを逐次化することができます。

Djangoまたはwadofstuffシリアライザがフィールドフィールドを使用しないように私のシリアル化を手書きで書く方法がありますか?

+0

あり、これを変更する方法がありますが、私は理由を知って興味があると思いますあなたの同僚はそれをデシリアライズするような問題を抱えています。 –

+0

問題は、4つの異なるモデルが直列化されたより複雑なオブジェクトがあり、そのうちの2つのモデルにはさらに別のモデルがシリアル化されている場合です。 – jawilmont

答えて

16

シリアル化をカスタマイズする最も良い方法は、DjangoをPython dictsにシリアル化することです。そして、あなたは、ポストプロセスすることができ、それらのdictsをあなたが好きしかし、JSONにそれらをダンプする前に:

# this gives you a list of dicts 
raw_data = serializers.serialize('python', Phone.objects.all()) 
# now extract the inner `fields` dicts 
actual_data = [d['fields'] for d in raw_data] 
# and now dump to JSON 
output = json.dumps(actual_data) 
25

はさらに、ジャンゴでの一般的なモデルJSON出力を変更するより柔軟な方法があります。私は両方のpkmodelキーを取り除くと、私は返す上記の例で

from django.core.serializers.json import Serializer as Builtin_Serializer 

class Serializer(Builtin_Serializer): 
    def get_dump_object(self, obj): 
     return self._current 

: - (私はPythonの初心者です非常に簡単である)とget_dump_objectメソッドをオーバーライドdjango.core.serializersモジュールのソースコードを見てみましょうフィールドはすぐに。

元のコードは次のとおりです。

def get_dump_object(self, obj): 
    return { 
     "pk": smart_text(obj._get_pk_val(), strings_only=True), 
     "model": smart_text(obj._meta), 
     "fields": self._current 
    } 

元の質問に対する解決策は、例えば、次のようになります。

def get_dump_object(self, obj): 
    metadata = { 
     "pk": smart_text(obj._get_pk_val(), strings_only=True), 
     "model": smart_text(obj._meta), 
    } 
    return dict(metadata.items() + self._current.items()) 
+4

あなたは紳士で学者です。 –