February 07, 2021
Python에서 MongoDB서버(mongoDB Atals포함)연결 및 조작을 지원하는 모듈django ORM을 확장하여 Python개체를 mongoDB문서에 매핑해주는 모듈pymongo에 의존성을 갖는다.# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_name',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
},
'test_mongo': {
'ENGINE': 'djongo',
'NAME': 'db_name',
'CLIENT': {
'host': 'localhost',
'port': 27017,
'username': 'user',
'password': 'password',
'authSource': 'admin',
'authMechanism': 'SCRAM-SHA-1'
}
}
}router.py)# router.py
class Router:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'app_name':
return 'app_name'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'app_name':
return 'app_name'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'app_name' or obj2._meta.app_label == 'app_name':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'app_name':
return db == 'app_name'
return None# settings.py
DATABASES_ROUTERS = ['project_name.router.Router']# app/models.py
from djongo import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
...django의 models class가 아닌 djongo의 models class를 이용하여 작성mongoDB Atlas를 이용해야하며 비용이 발생한다. (free tier 존재)Django ORM을 지원해주는 djongo모듈이 있지만 온전히 지원되지 않는다.
다음은 boolean 타입의 데이터를 검색할때 djongo ORM, mongoDB CLI, pymongo의 결과 비교이다.
djongo ORM

mongoDB CLI

pymongo
