Overview
このチュートリアルでは、Django MongoDB Extensions から Django REST フレームワーク シリアライザーを Django プロジェクト内で使用する方法を学ぶことができます。
Django MongoDB Extensions は、Django MongoDB バックエンドの追加開発者ツールを含むパッケージです。このチュートリアルでは、Django MongoDB Extensions のシリアライザーを使用して、Django REST Framework API で MongoDB 固有のフィールドを表現する方法を説明します。
注意
Django REST Framework は Django MongoDB Extensions v0.3.0 以降で利用できます。
シリアライザー
Django MongoDB Extensions は、django_mongodb_extensions.rest_framework モジュールで次のシリアライザーを提供します。
MongoModelSerializer: MongoDB固有のフィールドを含む Diango モデルの最上位のシリアライザー。
ObjectIdAutoFieldを使用するモデルには、Diango REST フレームワークModelSerializerの代わりにこのシリアライザーを使用します。MongoModelSerializerは、埋め込みフィールド用にネストされたシリアライザーを自動的に生成します。EmbeddedModelSerializer:
EmbeddedModelクラスのシリアライザー。MongoModelSerializerは埋め込みフィールドを自動的に取り扱うため、埋め込みモデルの表示方法をカスタマイズする場合、または埋め込みデータを書き込み (write)する必要がある場合にのみEmbeddedModelSerializerを定義します。サブクラスを親モデルのシリアライザーの明示的フィールドとして割り当てます。PolymorphicEmbeddedModelSerializer: 多形埋め込みフィールドのシリアライザー。
MongoModelSerializerはこのシリアライザーを自動的に適用するため、直接参照する必要はありません。多形埋め込みフィールドは読み取り専用です。
MongoModelSerializer 次の MongoDB 固有のフィールドタイプに対して正しい Django REST フレームワーク フィールドを自動的に生成します。
ArrayFieldEmbeddedModelFieldEmbeddedModelArrayFieldPolymorphicEmbeddedModelField(読み取り専用)PolymorphicEmbeddedModelArrayField(読み取り専用)ObjectIdFieldObjectIdAutoField
前提条件
このチュートリアルを開始する前に、Django MongoDB バックエンドを使用する Django プロジェクトを作成します。プロジェクトを作成する方法については、「Django MongoDB バックエンドを使い始める」チュートリアルを参照してください。
Tutorial
次の手順は、 Diango MongoDB拡張機能 をインストールし、そのシリアライザーを使用してMongoDBからの映画データをDjango REST フレームワーク APIでモデル化する方法を示します。
ファイルを設定します。
開始するチュートリアルでは、次のコードを含む models.py ファイルを作成しました。
from django.db import models from django.conf import settings from django_mongodb_backend.fields import EmbeddedModelField, ArrayField from django_mongodb_backend.models import EmbeddedModel class Award(EmbeddedModel): wins = models.IntegerField(default=0) nominations = models.IntegerField(default=0) text = models.CharField(max_length=100) class Movie(models.Model): title = models.CharField(max_length=200) plot = models.TextField(blank=True) runtime = models.IntegerField(default=0) released = models.DateTimeField("release date", null=True, blank=True) awards = EmbeddedModelField(Award, null=True, blank=True) genres = ArrayField(models.CharField(max_length=100), null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title class Viewer(models.Model): name = models.CharField(max_length=100) email = models.CharField(max_length=200) class Meta: db_table = "users" managed = False def __str__(self): return self.name
アプリ ディレクトリにこのファイルが含まれていることを確認します。次に、models.py ファイルと同じディレクトリに serializers.py ファイルを作成します。
モデルをシリアライズします。
ObjectIdAutoField を使用するモデルをシリアル化するには、serializers.py ファイルで MongoModelSerializer を拡張するシリアライザーを定義します。次の例は、Viewer モデルのシリアライザーを定義しています。
from django_mongodb_extensions.rest_framework import MongoModelSerializer from .models import Viewer class ViewerSerializer(MongoModelSerializer): class Meta: model = Viewer fields = "__all__"
埋め込まれたモデルをシリアライズします。
埋め込みモデルを保存するフィールドをシリアライズするには、埋め込みモデルの EmbeddedModelSerializer を拡張するシリアライザーを定義し、親モデルのシリアライザーからそれを参照します。
Movie モデルと埋め込まれた Award モデルをシリアライズするには、serializers.py ファイルを次のように更新します。
from django_mongodb_extensions.rest_framework import ( MongoModelSerializer, EmbeddedModelSerializer, ) from .models import ( Viewer, Award, Movie, ) class ViewerSerializer(MongoModelSerializer): class Meta: model = Viewer fields = "__all__" class AwardSerializer(EmbeddedModelSerializer): class Meta: model = Award fields = "__all__" class MovieSerializer(MongoModelSerializer): awards = AwardSerializer() class Meta: model = Movie fields = "__all__"
注意
埋め込みモデル シリアライザーの動作
埋め込みモデルをシリアライズする場合は、次の動作に注意してください。
EmbeddedModelSerializerMeta.fieldsで明示的にリストしない限り、プライマリキーフィールドは除外されます。to_internal_value()メソッドはディクショナリーではなく、モデル インスタンスを返します。埋め込みモデルを直接保存することはできません。代わりに、親モデルを通じて保存してください。
モデルのシリアライズされた出力を表示。
シリアライザーを定義した後、それを使用してモデル インスタンスを原始データ型の辞書に変換し、Django REST フレームワーク で JSON としてレンダーできます。
以下のコマンドを実行中てPython シェル を起動します。
python manage.py shell
次に、次のコードを実行して、ビューアの sample_mflix.users コレクションをクエリし、結果をシリアライズします。
from sample_mflix.models import Viewer from sample_mflix.serializers import ViewerSerializer viewer = Viewer.objects.get(email="jason_momoa@gameofthron.es") serializer = ViewerSerializer(viewer) serializer.data
data 属性には、ビューアのシリアル化された表現が含まれており、次のような出力になります。
{'id': '...', 'name': 'Khal Drogo', 'email': 'jason_momoa@gameofthron.es'}
埋め込みモデルのシリアライズされた出力を表示します。
埋め込みモデルを含むモデルをシリアル化すると、シリアライザーは埋め込みモデルのフィールドを出力にネストします。
Python shell から、次のコードを実行する、sample_mflix.movies コレクションで映画をクエリし、結果をシリアル化します。
from sample_mflix.models import Movie from sample_mflix.serializers import MovieSerializer movie = Movie.objects.first() serializer = MovieSerializer(movie) serializer.data
シリアル化された出力では、映画内に awards 埋め込みモデルがネストされ、次のようになります。
{'id': '...', 'title': 'The Great Train Robbery', 'plot': 'A group of bandits stage a brazen train hold-up...', 'runtime': 11, 'released': '1903-12-01T00:00:00Z', 'awards': {'wins': 1, 'nominations': 0, 'text': '1 win.'}, 'genres': ['Short', 'Western']}
次のステップ
Django RESTフレームワークのチュートリアルが完了しました。これで、Django MongoDB Extensionsシリアライザーを使用して、MongoDBの映画関連フィールドをDjango RESTフレームワークAPIで表示するDjangoアプリケーションができました。
Django REST フレームワークについてさらに学ぶには、Django REST フレームワーク ドキュメントを参照してください。
Dlango MongoDB拡張機能パッケージの詳細については、 PyPI の diango-mongodb-extentions および GitHub の diango-mongodb-extentionsリポジトリ を参照してください。