Overview
このガイドでは、 MongoDBコレクションを表す Diango モデルを作成する方法を学習できます。モデルは、データの構造を定義するPythonクラスです。 Dlango MongoDBバックエンドを使用すると、各モデルをMongoDBコレクションにマッピングし、モデル オブジェクトを使用してコレクションのドキュメントを操作できます。
Tip
Diango モデルの詳細については、Diango ドキュメントの Model を参照してください。
サポートされているフィールド
このセクションでは、モデルに含めることができる次のフィールドに対する Dlango MongoDBバックエンドのサポートについて説明します。
Diango フィールド
次の表では、Diango MongoDBバックエンドがサポートする Dlango モデル フィールドについて説明しています。
フィールド型 | 説明 |
|---|---|
| Stores raw binary data. |
| Stores boolean ( True or False) values. |
| Stores string values. To store longer text values, use
TextField. |
| Stores date values in Python datetime.date instances. |
| Stores date and time values in Python datetime.datetime
instances. |
| Stores decimal values. |
| Stores values representing periods of time in
Python timedelta instances. |
| Stores CharField values and uses an EmailValidator
to verify that the value is an email address. |
| Stores file values. |
| Stores CharField values that represent filenames on your filesystem. |
| Stores float values. |
| Stores an IPv4 or IPv6 address in string format. |
| Stores a FileField value and verifies that the uploaded object
is a valid image. |
| Stores integer values up to 64 bits in size. |
| Stores JSON data. To learn more about this field, see the
Store JSON Data section in this guide. |
| Stores positive integer values up to 64 bits in size. |
| Stores positive integer values up to 32 bits in size. |
| Stores a short text label, often for URL values. |
| Stores integer values up to 32 bits in size. |
| Stores large text values. |
| Stores a CharField value representing a URL. |
| Stores instances of Python's UUID class. |
MongoDB BSONフィールド
MongoDB、 BSONと呼ばれるバイナリ形式でドキュメントを整理して保存し、柔軟なデータ処理を可能にしています。
Tip
MongoDB がBSONデータを保存する方法の詳細については、 MongoDB Serverマニュアルの「 BSON types 」を参照してください。
次の表では、サポートされているBSONフィールド型と、Diango モデルで使用できるそれに相当する Diango MongoDBバックエンド について説明しています。
BSONフィールド型 | Dpango MongoDBバックエンド フィールド型 | BSON の説明 |
|---|---|---|
|
| Stores array values. To learn more about using this field
with Django MongoDB Backend, see the Store Array Data section
in this guide. |
|
| Stores one or multiple embedded documents. To learn more about using these fields
with Django MongoDB Backend, see the Store Embedded Model Data and Store Embedded Model Array Data
sections. |
|
| Stores unique 12-byte identifiers that MongoDB uses as primary keys. |
|
| Stores binary data. |
|
| Stores true or false values. |
|
| Stores dates and times in milliseconds since the Unix
epoch, or January 1, 1970. |
|
| Stores 28-bit decimal values. |
|
| Stores floating-point values. |
|
| Stores 32-bit signed integers. |
|
| Stores 64-bit signed integers. |
|
| Stores UTF-8 encoded string values. |
モデルを定義する
MongoDBコレクション を表すモデルを作成するには、モデルクラスの定義をアプリケーションの models.pyファイルに追加します。 モデルクラスで、保存するフィールドを指定し、内部 Metaクラスにモデルメタデータを含めます。 また、__str__() メソッドを使用して、モデルの string 表現を定義することもできます。 モデルを定義するには、次の構文を使用します。
class <Model name>(models.Model): <field name> = <data type> # Include additional fields here class Meta: # Include metadata here def __str__(self): # Include logic for displaying your model as a string here
Tip
Metaクラスで指定できるメタデータオプションの詳細については、Diango ドキュメントのモデル メタ オプションを参照してください。
モデルを使用するには、プロジェクトの settings.pyファイルに追加する必要があります。 次のコードに示すように、INSTALLED_APPS の値を編集して、models.pyファイルを保存するモジュールの名前を含めます。
INSTALLED_APPS = [ '<application module>', # Include other app modules here ]
最後に、プロジェクトのルートディレクトリから次のデータベース移行コマンドを実行して、モデル用のMongoDBコレクションを作成するか、既存のコレクションを使用してモデル データを保存します。
python manage.py makemigrations <application name> python manage.py migrate
例
このサンプルmodels.pyファイルは、次の情報を含む Movie モデルクラスを定義します。
映画データを表すフィールドのリスト。
Metadb_tableオプションをmoviesに設定するクラス。 これは、Diango MongoDBバックエンドに対して、このモデルを使用してsample_mflix.moviesAtlasサンプルデータセットの コレクションを表すように指示します。また、
MetaクラスはmanagedオプションをFalseに設定し、Dlango MongoDBバックエンドにモデルの新しいコレクションを作成しないように指示します。__str__()メソッドを使用して、モデルの string 表現をtitleフィールド値として定義します。
from django.db import models 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) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Tip
モデルクラス定義で使用されるフィールドの詳細については、このガイドの「サポートされているフィールド」セクションを参照してください。
詳細フィールドの使用
このセクションでは、Diango モデルで次のフィールドを使用する方法を示します。
Store JSON Data
モデルで JSONField を使用してJSONオブジェクトを保存できます。 JSONはデータ交換のための人間が判読可能な形式であり、 JSONオブジェクトは string キーを値にマッピングするデータ コンテナです。 MongoDB はJSONデータをドキュメントに保存するための Objectフィールド型を提供し、このデータをBSON( Binary JSON)形式で内部的に保存します。
注意
埋め込みモデルと多形埋め込みモデルを使用してMongoDB Object を表すこともできます。
例
次の例では、このガイドのモデルの定義の例で作成されたモデルにJSONField 値を追加します。imdbと呼ばれる新しいフィールド には、各 Movieオブジェクトのユーザー評価を表すJSONデータが保存されます。
from django.db import models 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) imdb = models.JSONField(null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Tip
JSONField に保存されているデータをクエリする方法については、クエリの指定ガイドの「JSON値のクエリ」を参照してください。
制限
Dlango MongoDBバックエンドの JSONField のサポートには次の制限があります。
フィールドの値を
Noneに設定すると、Diango MongoDBバックエンド はその値をSQLNULL値として保存します。 あるいは、JSONFieldの値をValue(None, JSONField())に設定することもできます。これはJSONスカラーnullを表します。 ただし、クエリ時にSQLNULLとJSONnullを区別する方法はありません。Qオブジェクトを使用する一部のクエリでは、特にQuerySet.exclude()メソッドを使用する場合、期待どおりの結果が返されないことがあります。Dlango MongoDBバックエンドは、
None値を持つフィールドをクエリすると、フィールドが存在しないドキュメントを誤って返します。
配列データの保存
モデルで ArrayField を使用してデータのリストを保存できます。 ArrayField を作成するには、ArrayField()クラスコンストラクタを使用して次の引数を渡します。
base_field: 配列に保存される各値の基礎となるデータ型を指定します。 基本フィールドタイプとしてEmbeddedModelFieldまたはFileFieldを指定することはできません。size:(任意) 配列の最大サイズを指定します。options: (任意) Djangoフィールドオプションを指定します。使用可能なオプションのリストを表示するには、Diango ドキュメントのフィールド オプションを参照してください。
Tip
次の構文を使用して、配列値の配列を ArrayField に保存できます。
my_array = ArrayField( ArrayField( base_field, # ... Additional arguments ), )
例
次の例では、このガイドのモデルの定義の例で作成されたモデルにArrayField 値を追加します。genresと呼ばれる新しいフィールドには、映画ジャンルを表す CharField 値のリストが保存され、最大 5 値を保存できます。
from django.db import models from django_mongodb_backend.fields import ArrayField 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) genres = ArrayField( models.CharField(max_length=100), size=5, null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Tip
ArrayField に保存されているデータをクエリする方法については、クエリの指定ガイドの「配列値のクエリ」を参照してください。
埋め込みモデル データの保存
ネストされたドキュメント値を保存するMongoDB Object を表すには、EmbeddedModelField を使用します。 このタイプでは、1 つのモデルが フィールドの 1 つに個別のモデルを保存できます。 EmbeddedModelField を作成するには、埋め込みモデルクラスをEmbeddedModel 抽象モデルのサブクラスとして定義します。 次に、EmbeddedModelField() コンストラクターを使用して基本モデルクラスにフィールドを作成し、次の引数を渡します。
embedded_model: 保存するモデルクラスを指定します。options: (任意) Djangoフィールドオプションを指定します。使用可能なオプションのリストを表示するには、Diango ドキュメントのフィールド オプションを参照してください。
重要
makemigrations Diango コマンドは、埋め込みモデルへの変更を検出しません。 埋め込みモデルのクラスに変更を加えた場合、EmbeddedModelField に保存されるモデルは変更を反映しません。
例
この例では、 このガイドのEmbeddedModelField モデルの定義 の例で作成されたモデルに 値を追加します。awardsと呼ばれる新しいフィールド には、その値として埋め込み Award モデルが保存されます。 次のコードは、Award モデルを定義し、Movie モデルを変更して EmbeddedModelField を含めるようにします。
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelField 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) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Tip
EmbeddedModelField に保存されているデータをクエリする方法については、クエリの指定ガイドの「埋め込みモデル値のクエリ」を参照してください。
埋め込みモデル配列データの保存
EmbeddedModelArrayField を使用して、ドキュメントの配列を 1 対多の関係で保存するMongoDBドキュメントフィールドを表すことができます。配列内の各ドキュメントは、Diango MongoDBバックエンド EmbeddedModelField 値に対応します。EmbeddedModelArrayField を作成するには、EmbeddedModelArrayField()クラスコンストラクタを使用して次の引数を渡します。
embedded_model: 各配列項目に保存されているモデルを指定します。max_size:(任意) 配列の最大サイズを指定します。
例
この例では、 このガイドの モデルの定義 の例で作成されたモデルに EmbeddedModelArrayField 値を追加します。この castフィールドは、埋め込まれた Actor モデルの配列を保存します。次のコードは、Actor モデルを定義し、Movie モデルを変更して EmbeddedModelArrayField を含めるようにします。
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelArrayField class Actor(EmbeddedModel): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) role = 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) cast = EmbeddedModelArrayField(Actor, null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
多形埋め込みモデルデータの保存
複数のタイプの埋め込みドキュメントを保存できるMongoDBドキュメントフィールドを表すには、PolymorphicEmbeddedModelField を使用します。各埋め込みドキュメントは、 Diango MongoDBバックエンド モデルクラスによって表されます。
PolymorphicEmbeddedModelField を作成するには、embedded_models 引数を PolymorphicEmbeddedModelField()クラスコンストラクターに渡します。この引数は、フィールドが保存できるモデル クラスのリストを指定します。
例
この例では、このガイドのモデルの定義の例で作成されたモデルに PolymorphicEmbeddedModelField 値を追加します。この awardsフィールドは、Oscars または GoldenGlobes タイプの埋め込みモデルを保存できます。各埋め込みモデルには、映画が選出されたすべての オスカー または インデックス に関する情報が含まれています。
次のコードでは、Oscars と GoldenGlobes の埋め込みモデルを定義し、Movie モデルを変更して PolymorphicEmbeddedModelField を含めます。
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import PolymorphicEmbeddedModelField class Oscars(EmbeddedModel): wins = models.IntegerField(default=0) nominations = models.IntegerField(default=0) best_picture = models.BooleanField(default=False) class GoldenGlobes(EmbeddedModel): wins = models.IntegerField(default=0) nominations = models.IntegerField(default=0) 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 = PolymorphicEmbeddedModelField(["Oscars", "GoldenGlobes"], null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Tip
PolymorphicEmbeddedModelField に保存されているデータをクエリする方法については、クエリの指定ガイドの「多形埋め込みモデル値のクエリ」を参照してください。
多形埋め込みモデル配列データの保存
複数のタイプの埋め込みドキュメントを保存できるMongoDBドキュメントフィールドを表すには、PolymorphicEmbeddedModelArrayField を使用します。このフィールドはPolymorphicEmbeddedModelField と似ていますが、単一のドキュメントではなく 、埋め込みドキュメントの配列が保存されます。配列内の各埋め込みドキュメントは、 Diango MongoDBバックエンド モデルクラスによって表されます。
PolymorphicEmbeddedModelArrayField を作成するには、次の引数を PolymorphicEmbeddedModelArrayField()クラスコンストラクターに渡します。
embedded_models:フィールドが保存できるモデルクラスを指定しますmax_size: (任意) 配列の最大サイズを指定します
例
この例では、このガイドのモデルの定義の例で作成されたモデルに PolymorphicEmbeddedModelArrayField 値を追加します。この awardsフィールドは、Oscar または GoldenGlobe タイプの埋め込みモデルのリストを保存できます。各埋め込みモデルには、映画が選出した 1 つの オスカー または ドル記号 に関する情報が含まれています。
次のコードでは、Oscar と GoldenGlobe の埋め込みモデルを定義し、Movie モデルを変更して PolymorphicEmbeddedModelArrayField を含めます。
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import PolymorphicEmbeddedModelArrayField class Oscar(EmbeddedModel): category = models.CharField(max_length=200) year = models.IntegerField(default=0) class GoldenGlobe(EmbeddedModel): category = models.CharField(max_length=200) year = models.IntegerField(default=0) 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 = PolymorphicEmbeddedModelArrayField(["Oscar", "GoldenGlobe"], null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Tip
PolymorphicEmbeddedModelArrayField に保存されているデータをクエリする方法については、 クエリの指定ガイドの「多形埋め込みモデル配列値のクエリ」を参照してください。
詳細情報
モデルを使用してデータベース操作を実行する方法については、「 データの操作 」ガイドを参照してください。
Diango フィールドの詳細については、Diango ドキュメントの モデルフィールドに関する参照 を参照してください。