Docs Menu
Docs Home
/ /

Djongo アプリケーションを移行する

このガイドでは、Djongoプロジェクトを変更して Django MongoDBバックエンドを使用する方法を学ぶことができます。Djongo は、SQLクエリをMongoDBクエリ言語(MQL)クエリに変換するサードパーティのライブラリであり、Django バージョン 4.0 以前のバージョンでMongoDB をDjangoバックエンドとして使用できます。ただし、Django MongoDB バックエンド は公式にサポートされている統合であり、より包括的な Django のサポート、MongoDB の機能へのアクセスの拡張、Django の新しいバージョンとの互換性を提供します。

このガイドでは、次のアプリケーションコンポーネントを更新して、DjongoアプリケーションをDjango MongoDBバックエンドに移行する方法を示します。

  • データベース設定

  • モデル定義

  • Indexes

  • クエリ

  • 移行

Djongo の代わりに Django MongoDB バックエンド を使用して MongoDB に接続するには、アプリケーションの settings.py ファイルで DATABASES 設定を変更します。この設定のネストされた ENGINE キーの値を "djongo" から "django_mongodb_backend" に更新します。次に、CLIENT キーではなく、ネストされた HOST キーで接続文字列を指定します。

Tip

DATABASES 設定の詳細については、「データベース接続の構成」ガイドを参照してください。

次の例は、 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'
},
}

Django MongoDBバックエンドを使用するようにモデルを更新するには、モデル定義を次のように変更してください。

  1. models モジュールを、djongo からではなく django.db からインポートします。

  2. Diango MongoDBバックエンドが ObjectIdField タイプの _idフィールドを自動的に作成するため、明示的な ObjectIdField 定義を除きます。

  3. MongoDB固有の配列と埋め込みフィールドの構文を変更します。

重要

フィールド型

Djongo と Django MongoDBバックエンドでは、Django フィールドが同じ形式で保存される可能性が高くなります。ただし、統合のフィールド変換プロセスが異なるため、互換性が生じない可能性があります。問題が発生した場合は、このページの右側にある[Rate this page]タブを使用してフィードバックを提出することができます。

Tip

詳しくは、「モデル作成ガイド」を参照してください。

次の例は、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)

Djongo MongoDBバックエンドとの互換性のために Djongoアプリのインデックスを更新するには、Djongo MongoDBバックエンドが提供するインデックスクラスを使用する必要があります。

Djongo は、単一フィールドインデックス、複合インデックス、マルチキーインデックスのクラスなど、各MongoDBインデックスを表す個別のクラスを提供します。

Django MongoDBバックエンドは、すべてのインデックスタイプを表す次の3つのクラスを提供します。

  • Index クラス: Diango のインデックスクラス。すべての非検索インデックスタイプを表します

  • SearchIndex クラス: MongoDB 検索インデックスを表す Django MongoDBバックエンド固有のクラス

  • VectorSearchIndex クラス: MongoDB ベクトル検索インデックスを表す Diango MongoDBバックエンド固有のクラス

Tip

Django 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 モデルとして扱うため、そのフィールドを交流するには他のすべてのモデルと同じ構文を使用します。

重要

パフォーマンス低下

MongoDB​Djongo から Django MongoDBバックエンドに移行する場合は、パフォーマンスの変化をモニターして潜在的な回帰を特定し、見つかった場合は JIRAチケットをファイルすることをお勧めします。

Tip

Django MongoDBバックエンドを使用してモデルをクエリする方法の詳細については、クエリの指定ガイドを参照してください。

次の例は、Recipe モデルとその nutrition 埋め込みモデルフィールド(「埋め込みモデルの例」セクションで定義されている)に対する Djongo と Djongo MongoDBバックエンド クエリの違いを示しています。このコードは、Nutrition 埋め込みモデルの caloriesフィールドをクエリします。最初のクエリを表示するには [Djongo]タブを選択し、更新されたクエリを表示するには [Django MongoDB Backend]タブを選択します。

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 バックエンドを使用してデータベース操作を実行する方法の詳細については、CRUD 操作ガイドを参照してください。

Django MongoDBバックエンドモデルの作成について学ぶには、モデルの作成ガイドを参照してください。

戻る

トランザクション

項目一覧