Taula de continguts

Django amb MongoDB

En aquest article provarem de veure quines opcions tenim per treballar amb Django i la BD basada en documents: MongoDB. La informació està extreta de diversos tutorials, articles i materials multimèdia trobats a motors de cerca fins a la data d'avui (23-06-2023). És probable i desitjable (com veureu) que hi hagi millores a partir d'aquesta data sobre aquest tema.

Referències:

, , , , , , , , , , ,


Suport de Django a bases de dades NoSQL?

Segons la documentació Django actualment dona suport oficial a les següents bases de dades:

Es a dir, bàsicament, l'ORM de Django mapeja funcions a consultes SQL i així és com llegim, escrivim i migrem la nostra base de dades. Això no vol dir no que puguem treballar amb MongoDB. Tenim eines que ens permeten connectar-nos a base de dades amb MongoDB. Les veiem a continuació:

Djongo

Djongo no fa cap canvi al marc existent de Django ORM, la qual cosa significa que no apareixen errors innecessaris ni vulnerabilitats de seguretat. Simplement, tradueix una cadena de consulta SQL a un document de consulta MongoDB. Com a resultat, totes les funcions, models, etc. de Django funcionen tal qual.

Si ja tens un projecte amb una base de dades SQL, instal·leu Djongo:

pip install djongo

Ara, aneu a la carpeta del vostre projecte (per exemple, MyFirstDjangoProj ) i obriu el fitxer settings.py. Podeu editar-lo a Textpad, Python IDE o qualsevol editor. Cerqueu BASES DE DADES i canvieu la configuració perquè apunti a MongoDB. El MOTOR serà djongo i el nom de la base de dades (NOM) serà el nom de la vostra base de dades MongoDB.

DATABASES = {
     'default': {
         'ENGINE': 'djongo',
         'NAME': 'db-name',
     }
 }

Si la vostra base de dades no es troba a localhost o està protegida, també hauríeu d'omplir la informació del CLIENT com HOST, USERNAME, PASSWORD, etc.

DATABASES = {
      'default': {
          'ENGINE': 'djongo',
          'NAME': 'your-db-name',
          'ENFORCE_SCHEMA': False,
          'CLIENT': {
              'host': 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority'
          }  
      }
}

Assegureu-vos que el nom de l'aplicació s'afegeix a la configuració INSTALLED_APPS del vostre settings.py:

INSTALLED_APPS = [
  'myfirstapp',
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]

Ara que tenim el projecte (i l'aplicació) Django, podeu crear les col·leccions a MongoDB mitjançant les ordres:

python manage.py makemigrations <app-name>
python manage.py migrate

I podeu continuar fent servir el Django Admin.

Tot és fàcil i meravellós però:

Djongo encara està en estat de proves, és incomplet i només mapeja consultes bàsiques sense tenir en compte totes les funcionalitats. Si requeriu alguna cosa més complexa, us haureu d'espavilar vosaltres com a desenvolupadors.

Djongo actualment té molt poc suport a incidències que s'estan generant i ara per ara no és compatible a versions del Django superiors a la 3.0.5.

Djongo converteix les consultes SQL en consultes MongoDB, cosa que realment no té sentit en una base de dades de documents. No obtindreu cap dels avantatges de MongoDB. I en realitat podria provocar un rendiment baix a MongoDB vs SQL.

Continua sent una eina molt potent i per desenvolupaments petits o pràctiques d'aula crec que me'l quedo. Però aneu molt amb compte per desenvolupaments més grans o amb moltes dades.

Connecteu Django i MongoDB mitjançant PyMongo

PyMongo és el controlador natural per connectar-nos de manera eficient a una base de dades MongoDB. Com que PyMongo està disponible amb PyPI, podeu instal·lar-lo ràpidament mitjançant una comanda pip:

pip install pymongo[snappy,gssapi,srv,tls]

A continuació teniu un exemple de codi per a la connexió i les funcionalitats CRUD bàsiques:

Tutorial ràpid CRUD amb PyMongo
En aquest tutorial ràpid, demostrarem com utilitzar PyMongo per fer operacions CRUD senzilles. Per a això, creem una sessió de PyMongo:
exemple.py
import pymongo
#connect_string = 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority' 
 
from django.conf import settings
my_client = pymongo.MongoClient(connect_string)
 
# First define the database name
dbname = my_client['sample_medicines']
 
# Now get/create collection name (remember that you will see the database in your mongodb cluster only after you create a collection
collection_name = dbname["medicinedetails"]
 
#let's create two documents
medicine_1 = {
    "medicine_id": "RR000123456",
    "common_name" : "Paracetamol",
    "scientific_name" : "",
    "available" : "Y",
    "category": "fever"
}
medicine_2 = {
    "medicine_id": "RR000342522",
    "common_name" : "Metformin",
    "scientific_name" : "",
    "available" : "Y",
    "category" : "type 2 diabetes"
}
# Insert the documents
collection_name.insert_many([medicine_1,medicine_2])
# Check the count
count = collection_name.count()
print(count)
 
# Read the documents
med_details = collection_name.find({})
# Print on the terminal
for r in med_details:
    print(r["common_name"])
# Update one document
update_data = collection_name.update_one({'medicine_id':'RR000123456'}, {'$set':{'common_name':'Paracetamol 500'}})
 
# Delete one document
delete_data = collection_name.delete_one({'medicine_id':'RR000123456'})


Treballant d'aquesta manera si podem aconseguir tota la potència de Mongo, a més podem disposar d'eines com MongoEngine. MongoEngine és una capa ORM a la part superior de PyMongo. L'ús de MongoEngine per connectar Django i MongoDB us ofereix camps com ListField i DictField per gestionar enormes dades JSON no estructurades.

Ok, amb això no tindré problemes però:

Adeu a l'ORM de Django, haureu de fer les vostres consultes des de zero, així que oblideu-vos de tot el que sabeu sobre la «manera Django» predeterminada.

Adeu a aquest Admin tan xulo treballa fent crides a l'ORM, per tant, veig difícil poder-ho adaptar fàcilment ara per ara.

Adeu a les migracions i la validació dels models automàtica,

Tot i en aquestes condicions encara Django és un framework bo per treballar, però no prou per plantejar-te si és la millor opció disponible per treballar amb MongoDB. Quina proposes tu?

Exercici proposat

Instal·lat el MongoDB al teu dispositiu i adapta l'exercici del tutorial de Django (Polls) amb la nova base de dades fent servir Djongo.

Fes proves de totes les funcionalitats del tutorial: Models, Admin, Migrations, Fakers

Comenta si has tingut algun problema i com el podries resoldre.