Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Diango MongoDBバックエンド
/

モデルの作成

このガイドでは、 MongoDBコレクションを表す Diango モデルを作成する方法を学習できます。モデルは、データの構造を定義するPythonクラスです。 Dlango MongoDBバックエンドを使用すると、各モデルをMongoDBコレクションにマッピングし、モデル オブジェクトを使用してコレクションのドキュメントを操作できます。

Tip

Diango モデルの詳細については、Diango ドキュメントの Model を参照してください。

このセクションでは、モデルに含めることができる次のフィールドに対する Dlango MongoDBバックエンドのサポートについて説明します。

次の表では、Diango MongoDBバックエンドがサポートする Dlango モデル フィールドについて説明しています。

フィールド型
説明

BigIntegerField

Stores IntegerField values up to 64 bits in size.

BinaryField

Stores raw binary data.

BooleanField

Stores boolean (True or False) values.

CharField

Stores string values. To store longer text values, use TextField.

DateField

Stores date values in Python datetime.date instances.

DateTimeField

Stores date and time values in Python datetime.datetime instances.

DecimalField

Stores decimal values.

DurationField

Stores values representing periods of time in Python timedelta instances.

EmailField

Stores CharField values and uses an EmailValidator to verify that the value is an email address.

FileField

Stores file values.

FilePathField

Stores CharField values that represent filenames on your filesystem.

FloatField

Stores float values.

GenericIPAddressField

Stores an IPv4 or IPv6 address in string format.

ImageField

Stores a FileField value and verifies that the uploaded object is a valid image.

IntegerField

Stores integer values up to 32 bits in size.

JSONField

Stores JSON data. To learn more about this field, see the Store JSON Data section in this guide.

PositiveBigIntegerField

Stores positive integer values up to 64 bits in size.

PositiveIntegerField

Stores positive integer values up to 32 bits in size.

PositiveSmallIntegerField

Stores positive integer values up to 16 bits in size.

SlugField

Stores a short text label, often for URL values.

SmallIntegerField

Stores integer values up to 16 bits in size.

TextField

Stores large text values.

URLField

Stores a CharField value representing a URL.

UUIDField

Stores instances of Python's UUID class.

MongoDB、 BSONと呼ばれるバイナリ形式でドキュメントを整理して保存し、柔軟なデータ処理を可能にしています。

Tip

MongoDB がBSONデータを保存する方法の詳細については、 MongoDB Serverマニュアルの「 BSON types 」を参照してください。

次の表では、サポートされているBSONフィールド型と、Diango モデルで使用できるそれに相当する Diango MongoDBバックエンド について説明しています。

BSONフィールド型
Dpango MongoDBバックエンド フィールド型
BSON の説明

Array

ArrayField

Stores array values. To learn more about using this field with Django MongoDB Backend, see the Store Array Data section in this guide.

Object

EmbeddedModelField or EmbeddedModelArrayField

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.

ObjectId

ObjectIdField

Stores unique 12-byte identifiers that MongoDB uses as primary keys.

Binary

BinaryField

Stores binary data.

Boolean

BooleanField

Stores true or false values.

Date

DatetimeField

Stores dates and times in milliseconds since the Unix epoch, or January 1, 1970.

Decimal128

DecimalField

Stores 28-bit decimal values.

Double

FloatField

Stores floating-point values.

Int32

IntegerField

Stores 32-bit signed integers.

Int64

IntegerField or BigIntegerField

Stores 64-bit signed integers.

String

CharField or TextField

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 モデルで次のフィールドを使用する方法を示します。

モデルで 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バックエンド はその値をSQL NULL 値として保存します。 あるいは、JSONField の値を Value(None, JSONField()) に設定することもできます。これはJSONスカラー null を表します。 ただし、クエリ時にSQL NULL とJSON null を区別する方法はありません。

  • 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 タイプの埋め込みモデルを保存できます。各埋め込みモデルには、映画が選出されたすべての オスカー または インデックス に関する情報が含まれています。

次のコードでは、OscarsGoldenGlobes の埋め込みモデルを定義し、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 つの オスカー または ドル記号 に関する情報が含まれています。

次のコードでは、OscarGoldenGlobe の埋め込みモデルを定義し、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 ドキュメントの モデルフィールドに関する参照 を参照してください。

戻る

インデックスの作成

項目一覧