Django2系とdjango rest frameworkでjsonへのserializationとdeserializationする方法

前回、モデルを作ったので、Django rest frameworkを利用して、
jsonへのserializationとdeserializationをしたいと思います。

Serializerクラスを継承して,ModelをSerializeする

django rest frameworkには、Serializerクラスがあり、そのクラスを継承することによって、
比較的簡単にSerializeすることができます。

restful01/flowersに新しくserializers.pyを作り、Serializerを継承したクラスを作ります。

まず必要な部品のインポートを行い、
Serializerを継承したクラス内で、
serializeしたいAttributeを宣言します。


from rest_framework import serializers
from flowers.models import Flower

class FlowerSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=150)
    description = serializers.CharField(max_length=250)
    release_date = serializers.DateTimeField()
    flower_category = serializers.CharField(max_length=200)
    was_included_in_home = serializers.BooleanField(required=False)

		

続いて、override methodであるcreateを実装します。
その名の通り、Serialize Objectを生成し、返却します。


def create(self, validated_data):
    return Flower.objects.create(**validated_data)
    

次にoverride methodであるupdateを実装します。
その名の通り、Serializeしたオブジェクトの更新し、更新されたinstanceを返却します。


def update(self, instance, validated_data):
    instance.name = validated_data.get('name', instance.name)
    instance.description = validated_data.get('description', instance.description)
    instance.release_date = validated_data.get('release_date', instance.release_date)
    instance.flower_category = validated_data.get('flower_category', instance.flower_category)
    instance.was_included_in_home = validated_data.get('was_included_in_home', instance.was_included_in_home)
    instance.save()
    return instance
    

以下が、FlowerSerializerクラスの全体のコードです。


from rest_framework import serializers
from flowers.models import Flower

class FlowerSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=150)
    description = serializers.CharField(max_length=250)
    release_date = serializers.DateTimeField()
    flower_category = serializers.CharField(max_length=200)
    was_included_in_home = serializers.BooleanField(required=False)
    def create(self, validated_data):
        return Flower.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.release_date = validated_data.get('release_date', instance.release_date)
        instance.flower_category = validated_data.get('flower_category', instance.flower_category)
        instance.was_included_in_home = validated_data.get('was_included_in_home', instance.was_included_in_home)
        instance.save()
        return instance
    

Django shellを使ってSerializeの実験をする

Flowers modelのSerializeが行われているかどうか実験してみましょう。
仮想環境でpythonのコードを実行するために、Django shellを起動します。
以下のコマンドを叩いてください。


python manage.py shell
    

Djangoのinteractive shellが起動したら、まず以下をimportします。


from datetime import datetime
from django.utils import timezone
from django.utils.six import BytesIO
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from flowers.models import Flower
from flowers.serializers import FlowerSerializer
    

上記をimportしたら、Flower modelをSQliteに挿入してみましょう


flower_release_date = timezone.make_aware(datetime.now(), timezone.get_current_timezone())
flower1 = Flower(name='Lily', description='Lily', release_date=flower_release_date, flower_category='Lilium', was_included_in_home=False)
flower1.save()
    

saveメソッドを呼ぶことによって、db内にdataがinsertされます。 そして、挿入されたdataのカラムをにアクセスするには、.を使用します。


例:
print(flower.pk)
print(flower.name)
print(flower.created)
    

続いて、FlowerSerializerを使用してjsonにSerializeして出力してみます。


serializer_for_flower = FlowerSerializer(flower)
print(serializer_for_flower.data)

出力結果:
{'pk': 1, 'name': 'Lily', 'description': 'Lily', 'release_date': '2018-05-19T07:50:51.031024Z', 'flower_category': 'Lilium', 'was_included_in_home': False}
    

insertしたFlower modelをjson形式で出力することができました。

json formatからモデルを作成する deserialize

今度は、json形式の文からモデルを作成してみます。


# Flower用のjson形式の文字列を作る
json_for_flower = '{"name":"sakura","description":"sakura", "release_date":"2018-05-19T10:20:00.111111Z","flower_category":"Rosaceae","was_included_in_home":false}'

# byte codeに変換
json_bytes_for_flower = bytes(json_for_flower, encoding="UTF-8")

#BytesIOに変換
stream_for_flower = BytesIO(json_bytes_for_flower)

# JSONParserを使ってpythonの辞書型に変換
parser = JSONParser()
parsed_flower = parser.parse(stream_for_flower)
# Flowerモデルに変換
flower_serializer = FlowerSerializer(data=parsed_flower)
# 正しく変換されている確認する
if flower_serializer.is_valid():
    flower2 = flower_serializer.save()
    print(flower2.name)

出力:
sakura
		

これで、json formatからFlowerモデルに変換され、 flowers_flower tableに新しくsakuraがinsertされます。

serializers.Serializerを使った、json形式によるSerializeとDeserializeのやり方を確認しました。

初版:2018/5/19

このエントリーをはてなブックマークに追加