Django標準のjson serializerをカスタマイズする
Djangoは標準でjsonにシリアライズする関数があるんですが、
from django.core import serializers # recordsはModel.objects.all()とかの結果 data = serializers.serialize("json", records, ensure_ascii=False) # これのことです。
標準の機能だとpkとmodelとfieldsがキーになったjsonオブジェクトになってます。
でもpkとmodelが邪魔なのでfieldsの値だけを抽出したいんです。
それが今回のテーマです。
元々親切に簡単に拡張出来るようになっているのでそれを利用します。
(今回はDjango1.5を使ってます。)
まずjson.Serializerを継承したクラスを作ります。
# serializer.py # -*- coding: utf-8 -*- from django.core.serializers.json import Serializer as JSONSerializer class Serializer(JSONSerializer): def get_dump_object(self, obj): return self._current def start_serialization(self): super(Serializer, self).start_serialization() self.json_kwargs["ensure_ascii"] = False
次にこのクラスを読み込む為にsettings.pyを編集します。
良い名前が思いつかないのでplainjsonとでもしておきます。
# settings.py SERIALIZATION_MODULES = { "plainjson": "myproject.serializer" }
実際の呼び出しは
from django.core import serializers data = serializers.serialize("plainjson", records)
これでpkとmodelが削られたjsonにシリアライズされます。
ちなみにstart_serializationをオーバーライドしてるのは、まぁ日本語はそのまんま出したいだろうって意図です。ちょっとだけコード量が減るってだけです。