Overview
このガイドでは、 MongoDBコレクションを表す Diango モデルを作成する方法を学習できます。モデルは、データの構造を定義するPythonクラスです。 Dlango MongoDBバックエンドを使用すると、各モデルをMongoDBコレクションにマッピングし、モデル オブジェクトを使用してコレクションのドキュメントを操作できます。
Tip
Diango モデルの詳細については、Diango ドキュメントの Model
を参照してください。
サポートされているフィールド
このセクションでは、モデルに含めることができる次のフィールドに対する Dlango MongoDBバックエンドのサポートについて説明します。
Diango フィールド
次の表では、Diango MongoDBバックエンドがサポートする Dlango モデル フィールドについて説明しています。
フィールド型 | 説明 |
---|---|
| Stores IntegerField values up to 64 bits in size. |
| 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 32 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 positive integer values up to 16 bits in size. |
| Stores a short text label, often for URL values. |
| Stores integer values up to 16 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
クラスで指定できるメタデータオプションの詳細については、Diango Meta
ドキュメントの「 モデル メタ オプション 」を参照してください。
モデルを使用するには、プロジェクトの 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
モデルクラスを定義します。
映画データを表すフィールドのリスト。
Meta
db_table
オプションをmovies
に設定するクラス。 これは、Diango MongoDBバックエンドに対して、このモデルを使用してsample_mflix.movies
Atlasサンプルデータセットの コレクションを表すように指示します。また、
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
:(任意)Diangoフィールドオプションを指定します。使用可能なオプションのリストを表示するには、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
:(任意)Diangoフィールドオプションを指定します。使用可能なオプションのリストを表示するには、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 ドキュメントの モデルフィールドに関する参照 を参照してください。