Overview
このガイドでは、Djongoプロジェクトを変更して Django MongoDBバックエンドを使用する方法を学ぶことができます。Djongo は、SQLクエリをMongoDBクエリ言語(MQL)クエリに変換するサードパーティのライブラリであり、Django バージョン 4.0 以前のバージョンでMongoDB をDjangoバックエンドとして使用できます。ただし、Django MongoDB バックエンド は公式にサポートされている統合であり、より包括的な Django のサポート、MongoDB の機能へのアクセスの拡張、Django の新しいバージョンとの互換性を提供します。
このガイドでは、次のアプリケーションコンポーネントを更新して、DjongoアプリケーションをDjango MongoDBバックエンドに移行する方法を示します。
データベース設定
Djongo の代わりに Django MongoDBバックエンド を使用してMongoDBに接続するには、アプリケーションの settings.pyファイルの DATABASES 設定を変更します。この設定のネストされた ENGINE キーの値を "djongo" から "django_mongodb_backend" に更新します。次に、CLIENT キーではなく、ネストされた HOST キーで接続文字列を指定します。
Tip
DATABASES 設定の詳細については、 「 MongoDBへの接続 」ガイドを参照してください。
例
次の例は、 DATABASES 設定を変更してMongoDBバックエンドを使用する方法を示しています。初期設定構成を確認するには [Djongo]タブを選択し、更新された設定を確認するには [Django MongoDB Backend]タブを選択します。
DATABASES = { 'default': { 'ENGINE': 'djongo', 'CLIENT': { 'host': 'mongodb+srv://cluster0.example.mongodb.net', }, 'NAME': 'my_database' } }
DATABASES = { 'default': { 'ENGINE': 'django_mongodb_backend', 'HOST': 'mongodb+srv://cluster0.example.mongodb.net', 'NAME': 'my_database' }, }
インストールされたアプリ
Djongo では、Diango に組み込まれている contrib アプリの追加構成は必要ありません。ただし、Dlango MongoDBバックエンドでは、デフォルトのプライマリキーフィールド型として ObjectIdAutoField を使用するモデルを含む各 contribアプリが必要です。これは次のアプリに影響します。
django.contrib.admindjango.contrib.authdjango.contrib.contenttypes
Tip
プロジェクト テンプレート
diango-mongodb-project テンプレートには、前述のアプリに必要な AppConfig サブクラスと MIGRATION_MODULES 設定が含まれています。このテンプレートを使用してプロジェクトを作成する方法については、「Dpango MongoDBバックエンドを使い始める」チュートリアルを参照してください。
これらのアプリを構成するには、プロジェクトディレクトリ内の apps.pyファイルを作成または更新して、前述の各アプリに対してカスタム AppConfig サブクラスを定義します。次の例は、これらの AppConfig サブクラスを定義するサンプルapps.pyファイルを示しています。
from django.contrib.admin.apps import AdminConfig from django.contrib.auth.apps import AuthConfig from django.contrib.contenttypes.apps import ContentTypesConfig class MongoAdminConfig(AdminConfig): default_auto_field = "django_mongodb_backend.fields.ObjectIdAutoField" class MongoAuthConfig(AuthConfig): default_auto_field = "django_mongodb_backend.fields.ObjectIdAutoField" class MongoContentTypesConfig(ContentTypesConfig): default_auto_field = "django_mongodb_backend.fields.ObjectIdAutoField"
次に、settings.pyファイルの INSTALLED_APPS 設定を更新して、デフォルトクラスの代わりにカスタム AppConfig クラスを使用します。次の例では、 myproject という名前のプロジェクトの設定を更新して、カスタム AppConfig クラスを使用します。初期設定を確認するには [Djongo]タブを選択し、更新された設定を確認するには [Django MongoDB Backend]タブを選択します。
INSTALLED_APPS = [ 'myapp.apps.MyAppConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
INSTALLED_APPS = [ 'myapp.apps.MyAppConfig', 'myproject.apps.MongoAdminConfig', 'myproject.apps.MongoAuthConfig', 'myproject.apps.MongoContentTypesConfig', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django_mongodb_backend', ]
最後に、MIGRATION_MODULES 設定を settings.pyファイルに追加して、影響を受ける contrib アプリのMongoDB互換移行モジュールを使用するように Diango MongoDBバックエンドに指示します。
MIGRATION_MODULES = { 'admin': 'mongo_migrations.admin', 'auth': 'mongo_migrations.auth', 'contenttypes': 'mongo_migrations.contenttypes', }
Tip
移行を実行する
上記の手順を完了したら、次のコマンドを実行して、contrib アプリの移行を適用します。
python manage.py makemigrations python manage.py migrate
モデル定義
Django MongoDBバックエンドを使用するようにモデルを更新するには、モデル定義を次のように変更してください。
modelsモジュールを、djongoからではなくdjango.dbからインポートします。Diango MongoDBバックエンドが
ObjectIdFieldタイプの_idフィールドを自動的に作成するため、明示的なObjectIdField定義を除きます。MongoDB固有の配列と埋め込みフィールドの構文を変更します。
重要
フィールド型
Djongo と Django MongoDBバックエンドでは、Django フィールドが同じ形式で保存される可能性が高くなります。ただし、統合のフィールド変換プロセスが異なるため、互換性が生じない可能性があります。問題が発生した場合は、このページの右側にある[Rate this page]タブを使用してフィードバックを提出することができます。
Tip
詳細なMongoDBバックエンド モデルについては、「コレクションを表すモデルの作成」ガイドを参照してください。
単一モデルの例
次の例は、Recipe という名前のモデルクラスをDjango MongoDBバックエンドとの互換性のために更新する方法を示しています。初期モデルを表示するには [Djongo]タブを選択し、更新されたモデルを表示するには [Django MongoDB Backend]タブを選択します。
from djongo import models class Tag(models.Model): data = models.CharField(max_length=100) class Meta: abstract = True class Recipe(models.Model): _id = models.ObjectIdField() title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) tags = models.ArrayField(model_container=Tag)
from django.db import models from django_mongodb_backend.fields import ArrayField class Recipe(models.Model): title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) tags = ArrayField( models.CharField(max_length=100), size=4, null=True, blank=True)
前述のフィールドを保存する Recipeオブジェクトを作成するには、次のコードを使用します。
Recipe.objects.create( title="Tiramisu", cuisine="Italian", cook_time=20, tags=[ {"data": "dessert"}, {"data": "classic"}, {"data": "espresso"}, {"data": "chocolate"} ] )
Recipe.objects.create( title="Tiramisu", cuisine="Italian", cook_time=20, tags=["dessert", "classic", "espresso", "chocolate"] )
埋め込みモデルの例
Djongo を使用する場合、埋め込みMongoDBドキュメントを表すために EmbeddedField を使用できます。複数の埋め込みドキュメントを保存するフィールドを定義するには、ArrayField を使用できます。
Django MongoDBバックエンドには、埋め込みドキュメントを表す次のフィールドが用意されています。
EmbeddedModelField: ネストされたモデルを保存しますEmbeddedModelArrayField: ネストされたモデルの配列を保存します
Tip
モデル多形
Djongo フィールドを使用して複数のモデル タイプの配列を保存することはできません。ただし、Django MongoDBバックエンドは多形データをサポートするために PolymorphicEmbeddedModelField フィールドと PolymorphicEmbeddedModelArrayField フィールドを提供します。詳細については、モデル作成ガイドの「詳細フィールドの使用」を参照してください。
次の例では、次の埋め込みモデル フィールドを含む Recipe モデルを定義する models.pyファイルを更新する方法を示しています。
nutrition: 栄養情報を表す 1 つの埋め込みNutritionモデルを保存reviews: 個々のレシピレビューを表す複数の埋め込みReviewモデルを保存
初期モデルを確認するには [Djongo]タブを選択し、更新されたモデルを確認するには [Django MongoDB Backend]タブを選択します。
from djongo import models class Nutrition(models.Model): calories = models.IntegerField(default=0) carb_grams = models.IntegerField(default=0) protein_grams = models.IntegerField(default=0) class Meta: abstract = True class Review(models.Model): author = models.CharField(max_length=100) rating = models.IntegerField(default=0) class Meta: abstract = True class Recipe(models.Model): _id = models.ObjectIdField() title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) nutrition = models.EmbeddedField(model_container=Nutrition) reviews = models.ArrayField(model_container=Review)
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelField, EmbeddedModelArrayField class Nutrition(EmbeddedModel): calories = models.IntegerField(default=0) carb_grams = models.IntegerField(default=0) protein_grams = models.IntegerField(default=0) class Review(EmbeddedModel): author = models.CharField(max_length=100) rating = models.IntegerField(default=0) class Recipe(models.Model): title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) nutrition = EmbeddedModelField(Nutrition, null=True, blank=True) reviews = EmbeddedModelArrayField(Review, null=True, blank=True)
Indexes
Djongo MongoDBバックエンドとの互換性のために Djongoアプリのインデックスを更新するには、Djongo MongoDBバックエンドが提供するインデックスクラスを使用する必要があります。
Djongo は、単一フィールドインデックス、複合インデックス、マルチキーインデックスのクラスなど、各MongoDBインデックスを表す個別のクラスを提供します。
Django MongoDBバックエンドは、すべてのインデックスタイプを表す次の3つのクラスを提供します。
Indexクラス: Diango のインデックスクラス。すべての非検索インデックスタイプを表しますSearchIndexクラス: MongoDB 検索インデックスを表す Django MongoDBバックエンド固有のクラスVectorSearchIndexクラス: MongoDB ベクトル検索インデックスを表す Diango MongoDBバックエンド固有のクラス
Tip
Dlango MongoDBバックエンド を使用してインデックスを作成する方法の詳細については、「クエリ最適化のインデックス」ガイドを参照してください。
例
次の例では、Recipe モデルで複合インデックスを更新する方法を示しています。Django MongoDBバックエンドの実装ではMongoDB検索インデックスも追加されています。このインデックスはDjongoではサポートされていません。初期インデックスを確認するには Djongoタブを選択し、更新されたインデックスを確認するには Django MongoDB Backendタブを選択します。
from djongo import models from djongo.models.indexes import CompoundIndex class Recipe(models.Model): _id = models.ObjectIdField() title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) class Meta: indexes = [ CompoundIndex(fields=["title", "cook_time"]) ]
from django.db import models from django_mongodb_backend.indexes import SearchIndex class Recipe(models.Model): title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) class Meta: indexes = [ models.Index(fields=["title", "cook_time"]), SearchIndex(fields=["cuisine"], name="cuisine_search_idx") ]
クエリ
DjangoのQuerySet APIを使用して、DjongoとMongoDBバックエンドモデルの両方をクエリできます。ただし、埋め込みモデル クエリの構文は異なります。
Djongo は埋め込みモデルをPython辞書として扱い、そのフィールドにアクセスまたは変更するにはPython構文を使用する必要があります。Django MongoDBバックエンドは埋め込みモデルを Django モデルとして扱うため、そのフィールドを交流するには他のすべてのモデルと同じ構文を使用します。
重要
パフォーマンス低下
MongoDBDjongo から Django MongoDBバックエンドに移行する場合は、パフォーマンスの変化をモニターして潜在的な回帰を特定し、見つかった場合は JIRAチケットをファイルすることをお勧めします。
Tip
Django MongoDBバックエンドを使用してモデルをクエリする方法の詳細については、クエリの指定ガイドを参照してください。
例
The following example shows the difference between a Djongo and a Django MongoDB Backend query on the Recipe model and its nutrition embedded model field, defined in the Embedded Model Example section. The code queries the Nutrition embedded model's calories field. Select the Djongo tab to see the initial query, and select the Django MongoDB Backend tab to see the updated query:
Recipe.objects.filter(nutrition__lt={'calories': 500})
Recipe.objects.filter(nutrition__calories__lt=500)
トランザクション
Djongo と MongoDB バックエンドはどちらも、Django のアトミックトランザクションAPI機能をサポートしています。ただし、この機能を実装するためのカスタムAPIをそれぞれ提供しています。コードのインポートステートメントを変更することで、Django MongoDBバックエンドとの互換性のためにトランザクションを更新できます。
Tip
Django MongoDBバックエンドを使用してトランザクションを実行する方法の詳細については、トランザクションとセッションのガイドを参照してください。
例
次の例は、コードを更新して Django MongoDBバックエンドのトランザクションAPIをインポートする方法を示しています。最初のステートメントを表示するには [Djongo]タブを選択し、更新されたステートメントを表示するには [Django MongoDB Backend]タブを選択します。
from djongo import transaction
from django_mongodb_backend import transaction
移行
Djongo はデータベースの移行をサポートしておらず、デフォルトではスキーマ検証を強制しません。settings.pyファイルで ENFORCE_SCHEMA 設定を True に設定すると、検索したドキュメントに欠落しているフィールド値がある場合、Djongo は MigrationErrors を強制します。
Django MongoDBバックエンドは、一部制限付きでデータベースの移行をサポートしています。これらの制限の詳細については、機能の互換性ガイドの移行サポートを参照してください。
Django MongoDBバックエンドではスキーマ検証を強制しません。その結果、データベーススキーマを更新するための移行を実行中ずにモデル フィールドを更新しても、エラーは生成されません。
詳細情報
Django MongoDBバックエンドを使用する新しいアプリケーションを設定する方法については、Django MongoDBバックエンドを使い始めるチュートリアルを参照してください。
Django MongoDB バックエンドを使用してデータベース操作を実行する方法の詳細については、CRUD 操作ガイドを参照してください。
Dpango MongoDBバックエンド モデルの作成の詳細については、「コレクションを表すモデルの作成」ガイドを参照してください。