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