Docs Menu
Docs Home
/ /

Djongo 애플리케이션 마이그레이션

이 가이드 에서는 Django MongoDB 백엔드를 사용하도록 Djoongo 프로젝트 수정하는 방법을 학습 수 있습니다. Djongo는 SQL 쿼리를 MongoDB Query Language(MQL) 쿼리로 변환하는 타사 라이브러리로, 이를 통해 Django 버전 4.0 및 이전 버전에서 MongoDB Django 백엔드 로 사용할 수 있습니다. 그러나 Django MongoDB 백엔드는 공식적으로 지원되는 통합 기능으로 보다 포괄적인 Django 지원 , MongoDB 기능에 대한 확장된 액세스 , 최신 Django 버전과의 호환성을 제공합니다.

이 가이드 다음 애플리케이션 구성 요소를 업데이트하여 Djoongo 애플리케이션 Django MongoDB 백엔드로 마이그레이션 방법을 보여줍니다.

  • 데이터베이스 설정

  • 모델 정의

  • Indexes

  • 쿼리

  • 마이그레이션

Dlongo 대신 Django MongoDB 백엔드를 사용하여 MongoDB 에 연결하려면 애플리케이션의 settings.py 파일 에서 DATABASES 설정을 수정합니다. 이 설정의 중첩된 ENGINE 키 값을 "djongo" 에서 "django_mongodb_backend"로 업데이트합니다. 그런 다음 CLIENT 키 대신 중첩된 HOST 키에 연결 문자열 지정합니다.

설정에 DATABASES 대해 자세히 학습 데이터베이스 연결 구성 가이드 참조하세요.

다음 예시 Django MongoDB 백엔드를 사용하도록 DATABASES 설정을 수정하는 방법을 보여줍니다. 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. djongo 대신 django.db 에서 models 모듈을 가져옵니다.

  2. 장고 MongoDB 백엔드는 ObjectIdField 유형의 _id 필드 자동으로 생성하므로 명시적인 ObjectIdField 정의를 제거합니다.

  3. MongoDB 전용 배열 및 포함된 필드의 구문을 수정합니다.

중요

필드 유형

Djongo 및 Django MongoDB 백엔드는 Django 필드를 동일한 형식으로 저장 가능성이 높습니다. 그러나 통합의 필드 변환기의 차이로 인해 비호환성이 발생할 수 있습니다. 문제가 발생하면 이 페이지 오른쪽에 있는 Rate this page 탭 사용하여 피드백 제출 수 있습니다.

Django MongoDB 백엔드 모델에 대해 자세히 학습 모델 생성 가이드 참조하세요.

다음 예시 Django MongoDB 백엔드와의 호환성을 위해 Recipe 이라는 모델 클래스를 업데이트 방법을 보여줍니다. 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를 사용할 때 EmbeddedField 를 사용하여 내장된 MongoDB 문서 나타낼 수 있습니다. 여러 내장된 문서를 저장하는 필드 정의하려면 ArrayField을 사용할 수 있습니다.

장고 MongoDB 백엔드는 내장된 문서를 나타내는 다음 필드를 제공합니다.

  • EmbeddedModelField: 중첩된 모델을 저장합니다.

  • EmbeddedModelArrayField: 중첩된 모델의 배열 저장합니다.

모델 다형성

Djongo 필드를 사용하여 여러 모델 유형의 배열 저장 수 없습니다. 그러나 장고 MongoDB 백엔드는 PolymorphicEmbeddedModelField PolymorphicEmbeddedModelArrayField 다형성을 지원 위해 및 필드를 제공합니다. 자세히 학습 모델 생성 가이드 에서 고급 필드 사용을 참조하세요.

다음 예시 다음과 같은 임베디드 모델 필드가 포함된 Recipe 모델을 정의하는 models.py 파일 업데이트 방법을 보여 줍니다.

  • nutrition: 영양 정보를 나타내는 하나의 임베디드 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)

Django MongoDB 백엔드 호환성을 위해 Djoongo 앱 에서 인덱스를 업데이트 하려면 Django MongoDB 백엔드에서 제공하는 인덱스 클래스를 사용해야 합니다.

Djongo는 단일 필드 인덱스, 복합 인덱스, 멀티키 인덱스 등에 대한 클래스를 포함하여 각 MongoDB 인덱스 나타내는 별도의 클래스를 제공합니다.

장고 MongoDB 백엔드는 모든 인덱스 유형을 나타내기 위해 다음 세 가지 클래스를 제공합니다.

  • Index class: 검색이 아닌 모든 인덱스 유형을 나타내는 Django의 인덱스 클래스

  • SearchIndex class: MongoDB Search 인덱스를 나타내는 장고 MongoDB 백엔드 전용 클래스

  • VectorSearchIndex class: MongoDB Vector Search 인덱스를 나타내는 장고 MongoDB 백엔드 전용 클래스

장고 MongoDB 백엔드를 사용하여 인덱스를 만드는 방법에 대해 자세히 학습 보려면 인덱스 만들기 가이드 참조하세요.

다음 예시 Recipe 모델에서 복합 인덱스 업데이트 방법을 보여줍니다. 장고 MongoDB 백엔드 구현 또한 장고가 지원 하지 않는 MongoDB 검색 인덱스 추가합니다. 초기 인덱스 보려면 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")
]

장고의 QuerySet API 사용하여 장고 및 장고 MongoDB 백엔드 모델을 모두 쿼리 할 수 있습니다. 그러나 임베디드 모델 쿼리의 경우 구문이 다릅니다.

Djongo는 임베디드 모델을 Python 딕셔너리로 취급하며, 해당 필드에 액세스 하거나 수정하려면 Python 딕셔너리 구문을 사용해야 합니다. 장고 MongoDB 백엔드는 내장된 모델을 장고 모델로 취급하므로 다른 모든 모델과 동일한 구문을 사용하여 해당 필드와 상호 작용할 수 있습니다.

중요

성능 회귀

Djongo 및 Django MongoDB 백엔드 쿼리는 서로 다른 기본 MQL 쿼리를 생성하므로 성능에 영향을 미칠 수 있습니다. Djongo에서 Django MongoDB 백엔드로 마이그레이션할 때는 성능 변경 사항을 모니터 잠재적인 회귀를 식별하고 발견하면 JIRA 티켓 파일 것이 좋습니다.

장고 MongoDB 백엔드를 사용하여 모델을 쿼리 방법에 대해 자세히 학습 쿼리 지정 가이드 참조하세요.

다음 예시 임베디드 Recipe 모델 예시 섹션에 정의된 모델과 해당 임베디드 모델 필드 nutrition 에 대한 Djoongo 쿼리와 Django MongoDB 백엔드 쿼리 간의 차이점을 보여줍니다. 이 코드는 Nutrition 임베디드 모델의 calories 필드 쿼리합니다.Djongo 초기 쿼리 보려면 탭 선택하고,Django MongoDB Backend 업데이트된 쿼리 보려면 탭 선택합니다.

Recipe.objects.filter(nutrition__lt={'calories': 500})
Recipe.objects.filter(nutrition__calories__lt=500)

Djongo와 Django MongoDB 백엔드는 모두 Django의 원자성 트랜잭션 API 기능을 지원 . 그러나 각각 이 기능을 구현 위한 사용자 지정 API 제공합니다. 코드의 import 성명서 수정하여 Django MongoDB 백엔드 호환성을 위해 트랜잭션을 업데이트 할 수 있습니다.

장고 MongoDB 백엔드를 사용하여 트랜잭션을 수행하는 방법에 대해 자세히 학습 트랜잭션 및 세션 가이드 참조하세요.

다음 예시 Django MongoDB 백엔드의 트랜잭션 API 가져오도록 코드를 업데이트 방법을 보여줍니다. Djongo 탭 선택하여 초기 성명서 확인하고 Django MongoDB Backend 탭 선택하여 업데이트된 성명서 확인합니다.

from djongo import transaction
from django_mongodb_backend import transaction

Djongo는 데이터베이스 마이그레이션을 지원 하지 않으며 기본값 으로 스키마 유효성 검사 시행하다 하지 않습니다. settings.py 파일 에서 ENFORCE_SCHEMA 설정을 True 로 설정하다 하면 검색된 문서에 누락된 필드 값이 있을 때 Djoongo가 MigrationErrors 를 적용합니다.

장고 MongoDB 백엔드는 몇 가지 제한 사항이 있지만 데이터베이스 마이그레이션을 지원합니다. 이러한 제한 사항에 대해 자세히 학습 기능 호환성 가이드 의 마이그레이션 지원을 참조하세요.

장고 MongoDB 백엔드는 스키마 유효성 검사 시행하다 하지 않습니다. 따라서 데이터베이스 스키마 업데이트 위해 마이그레이션을 실행 하지 않고 모델 필드를 업데이트해도 오류가 발생하지 않습니다.

Django MongoDB 백엔드를 사용하는 새 애플리케이션 설정하다 방법을 학습 시작하기 튜토리얼을 참조하세요.

장고 MongoDB 백엔드를 사용하여 데이터베이스 작업을 실행 방법에 대해 자세히 학습 CRUD 작업 수행 가이드 참조하세요.

장고 MongoDB 백엔드 모델 생성에 대해 자세히 학습 모델 생성 가이드 참조하세요.

돌아가기

트랜잭션

이 페이지의 내용