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
Use a JSONField 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 Use an ArrayField section
in this guide. |
|
| Stores embedded documents. To learn more about using this field
with Django MongoDB Backend, see the Use an EmbeddedModelField section in this guide. |
|
| 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 モデルで次のフィールド型を使用する方法を示します。
JSONField の使用
モデルで JSONField を使用してJSONオブジェクトを保存できます。 JSONはデータ交換のための人間が判読可能な形式であり、 JSONオブジェクトは string キーを値にマッピングするデータ コンテナです。 MongoDB はJSONデータをドキュメントに保存するための Objectフィールド型を提供し、このデータをBSON( Binary JSON)形式で内部的に保存します。
注意
MongoDB Object を表すために、EmbeddedModelField を使用することもできます。 このフィールドの詳細については、このガイドの「 埋め込みモデルフィールドの使用 」セクションを参照してください。
例
次の例では、このガイドのモデルの定義の例で作成されたモデルに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 クエリの指定ガイドの「 JSONField のクエリ 」を参照してください。
制限
Dlango MongoDBバックエンドの JSONField のサポートには次の制限があります。
フィールドの値を
Noneに設定すると、Diango MongoDBバックエンド はその値をSQLNULL値として保存します。 あるいは、JSONFieldの値をValue(None, JSONField())に設定することもできます。これはJSONスカラーnullを表します。 ただし、クエリ時にSQLNULLとJSONnullを区別する方法はありません。Qオブジェクトを使用する一部のクエリでは、特にQuerySet.exclude()メソッドを使用する場合、期待どおりの結果が返されないことがあります。Dlango MongoDBバックエンドは、
None値を持つフィールドをクエリすると、フィールドが存在しないドキュメントを誤って返します。
ArrayField の使用
モデルで ArrayField を使用してデータのリストを保存できます。 ArrayField を作成するには、ArrayField()クラスコンストラクタを使用して次の引数を渡します。
base_field: 配列に保存される各値の基礎となるデータ型を指定します。 基本フィールドタイプとしてEmbeddedModelFieldまたはFileFieldを指定することはできません。size:(任意) 配列の最大サイズを指定します。options: (任意) Djangoフィールドオプションを指定します。使用可能なオプションのリストを表示するには、Diango ドキュメントのフィールド オプションを参照してください。
Tip
配列値の配列を ArrayField に保存できます。多次元配列の例については、Diango PostgreSQL ドキュメントのArrayFieldを参照してください。
例
次の例では、このガイドのモデルの定義の例で作成されたモデルに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 クエリの指定ガイドの「 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 クエリの指定ガイドの「埋め込みModelField のクエリ」を参照してください。
詳細情報
モデルを使用してデータベース操作を実行する方法については、「 データの操作 」ガイドを参照してください。
Dpangoフィールド型の詳細については、Diango ドキュメントのモデルフィールドに関する参照を参照してください。