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 modelsfrom django.conf import settingsfrom django_mongodb_backend.fields import EmbeddedModelField, ArrayFieldfrom 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 モデルのシリアライザーを定義しています。
serializers.py
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 ファイルを次のように更新します。
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 Viewerfrom sample_mflix.serializers import ViewerSerializer
viewer = Viewer.objects.get(email="jason_momoa@gameofthron.es")serializer = ViewerSerializer(viewer)serializer.datadata 属性には、ビューアのシリアル化された表現が含まれており、次のような出力になります。
{'id': '...', 'name': 'Khal Drogo', 'email': 'jason_momoa@gameofthron.es'}埋め込みモデルのシリアライズされた出力を表示します。
埋め込みモデルを含むモデルをシリアル化すると、シリアライザーは埋め込みモデルのフィールドを出力にネストします。
Python shell から、次のコードを実行する、sample_mflix.movies コレクションで映画をクエリし、結果をシリアル化します。
from sample_mflix.models import Moviefrom 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リポジトリ を参照してください。