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をオーバーライドしてるのは、まぁ日本語はそのまんま出したいだろうって意図です。ちょっとだけコード量が減るってだけです。