Overview
En esta guía, aprenderá a modificar su proyecto Djongo para usar Django MongoDB Backend. Djongo es una biblioteca de terceros que traduce consultas SQL a consultas MQL (lenguaje de consulta MongoDB), lo que le permite usar MongoDB como backend para las versiones 4.0 y anteriores. Sin embargo, Django MongoDB Backend es la integración oficialmente compatible y ofrece un soporte más completo para Django, mayor acceso a las funciones de MongoDB y compatibilidad con las versiones más recientes de Django.
Esta guía muestra cómo migrar una aplicación Djongo a Django MongoDB Backend actualizando los siguientes componentes de la aplicación:
Configuración de la base de datos
Para conectarse a MongoDB usando Django MongoDB Backend en vez de Djongo, modifique el DATABASES Ajuste en el archivo settings.py de su aplicación. Actualice el valor de la clave ENGINE anidada de este ajuste de "djongo" a "django_mongodb_backend". A continuación, especifique la cadena de conexión en la clave HOST anidada en lugar de la clave CLIENT.
Tip
Para obtener más información sobre la configuración DATABASES, consulte la
Guía para conectar a MongoDB.
Ejemplo
El siguiente ejemplo muestra cómo modificar tu configuración de DATABASES para usar Django MongoDB Backend. Elija el Djongo pestaña para ver la configuración inicial y seleccione la pestaña Django MongoDB Backend para ver la configuración actualizada:
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' }, }
Definiciones de modelos
Para actualizar tus modelos para usar Django MongoDB Backend, realiza los siguientes cambios en las definiciones de tu modelo:
Importa el módulo
modelsdedjango.dben lugar dedjongo.Remueve las definiciones explícitas de
ObjectIdField, porque Django MongoDB Backend crea automáticamente un campo_idde tipoObjectIdField.Modificar la sintaxis de la matriz específica de MongoDB y los campos incrustados.
Importante
tipos de campo
Es probable que Djongo y Django MongoDB Backend almacenen los campos de Django en el mismo formato. Sin embargo, puede que experimentes incompatibilidades debido a diferencias en los convertidores de campos de las integraciones. Si encuentras algún inconveniente, puedes enviar tus comentarios usando la pestaña Rate this page al lado derecho de esta página.
Tip
Para obtener más información sobre los modelos de Backend de Django MongoDB, consulta la guía Crear Modelos para Representar Colecciones.
Ejemplo de modelo simple
El siguiente ejemplo muestra cómo actualizar una clase de modelo llamada Recipe para compatibilidad con Django MongoDB Backend. Seleccione la pestaña Djongo para ver el modelo inicial y seleccione la pestaña Django MongoDB Backend para ver el modelo actualizado:
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)
Para crear un objeto Recipe que almacene los campos anteriores, use el siguiente código:
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"] )
Ejemplo de modelo embebido
Al usar Djongo, puedes usar un EmbeddedField para representar un documento incrustado de MongoDB. Para definir un campo que almacene múltiples documentos incrustados, puede utilizar un ArrayField.
Django MongoDB Backend proporciona los siguientes campos que representan documentos incrustados:
EmbeddedModelFieldAlmacena un modelo anidadoEmbeddedModelArrayField: Almacena un arreglo de modelos anidados
Tip
Polimorfismo de modelo
No puedes usar los campos Djongo para almacenar un arreglo de varios tipos de modelos. Sin embargo, Django MongoDB backend proporciona los campos PolymorphicEmbeddedModelField y PolymorphicEmbeddedModelArrayField para admitir el soporte. Para obtener más información, consulte usar campos avanzados en la guía de creación de modelos.
El siguiente ejemplo muestra cómo actualizar un archivo models.py que define un modelo Recipe que contiene los siguientes campos de modelo incrustados:
nutrition: almacena un modeloNutritionembebido que representa la información sobre nutriciónreviews: Almacena múltiples modelos deReviewincrustados que representan reseñas individuales de recetas
Selecciona la pestaña Djongo para ver los modelos iniciales y la pestaña Django MongoDB Backend para ver los modelos actualizados:
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
Para actualizar los índices en su aplicación Djongo para la compatibilidad con Django MongoDB Backend, debe utilizar las clases de índice proporcionadas por Django MongoDB Backend.
Djongo proporciona clases separadas para representar cada índice de MongoDB, incluidas clases para índices de campo único, índices compuestos, índices de múltiples claves y más.
Django MongoDB Backend proporciona las siguientes tres clases para representar todos los tipos de índices:
Indexclase: La clase de índice de Django, que representa todos los tipos de índices no de búsquedaSearchIndexclase: una clase específica de Django MongoDB backend para representar los índices de búsqueda de MongoDBVectorSearchIndexclass: una clase específica de Django MongoDB Backend para representar los índices de MongoDB Vector Search
Tip
Para obtener más información sobre cómo utilizar Django MongoDB backend para crear índices, consulta la guía Índices para la optimización de query.
Ejemplo
El siguiente ejemplo muestra cómo actualizar un índice compuesto en un modelo Recipe. La implementación de Django MongoDB Backend también añade un índice MongoDB Search, que Djongo no admite. Seleccione la pestaña Djongo para ver el índice inicial y seleccione la pestaña Django MongoDB Backend para ver los índices actualizados:
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") ]
Queries
Puedes utilizar la API QuerySet de Django para consultar tanto los modelos de Djongo como los del backend MongoDB de Django. Sin embargo, la sintaxis difiere para las queries de modelos incrustados.
Djongo trata los modelos embebidos como diccionarios de Python, y se debe usar la sintaxis de diccionario de Python para acceder o modificar sus campos. Django MongoDB Backend trata los modelos intregado como modelos de Django, por lo que usas la misma sintaxis para interactuar con sus campos que con todos los demás modelos.
Importante
Regresiones de rendimiento
Las consultas de Djongo y Django MongoDB Backend generan diferentes consultas MQL subyacentes, lo que podría afectar el rendimiento. Al migrar de Djongo a Django MongoDB Backend, recomendamos supervisar los cambios de rendimiento para identificar posibles regresiones y generar un ticket de JIRA si detecta alguna.
Tip
Para obtener más información sobre cómo usar Django MongoDB Backend para consultar sus modelos, consulte la guía Especificar una consulta.
Ejemplo
El siguiente ejemplo muestra la diferencia entre una consulta de backend de Djongo y una de Django MongoDB sobre el Recipe modelo y su nutrition campo de modelo incrustado, definido en la sección "Ejemplo de Nutrition modelo incrustado". El código consulta el campo del modelo calories incrustado. Seleccione la Djongo pestaña para ver la consulta inicial y la Django MongoDB Backend pestaña para ver la consulta actualizada:
Recipe.objects.filter(nutrition__lt={'calories': 500})
Recipe.objects.filter(nutrition__calories__lt=500)
Transacciones
Tanto Djongo como Django MongoDB Backend admiten la funcionalidad de la API de transacciones atómicas de Django. Sin embargo, cada uno proporciona una API personalizada para implementar esta funcionalidad. Puedes actualizar tus transacciones para que sean compatibles con Django MongoDB Backend modificando la instrucción de importación en tu código.
Tip
Para obtener más información sobre cómo usar Django MongoDB backend para realizar transacciones, consulta la guía de Transacciones y Sesiones.
Ejemplo
El siguiente ejemplo muestra cómo actualizar el código para importar la API de transacciones del backend de Django MongoDB. Seleccione la pestaña Djongo para ver la declaración inicial y la pestaña Django MongoDB Backend para ver la declaración actualizada:
from djongo import transaction
from django_mongodb_backend import transaction
migración
Djongo no admite migraciones de bases de datos ni aplica la validación de esquemas de forma predeterminada. Si configura el valor ENFORCE_SCHEMA en True en su archivo settings.py, Djongo aplica MigrationErrors cuando faltan valores de campo en los documentos recuperados.
El backend de Django MongoDB admite migraciones de bases de datos con algunas limitaciones. Para obtener más información sobre estas limitaciones, consulte "Soporte de migración" en la guía de compatibilidad de funciones.
El backend de Django MongoDB no aplica la validación del esquema. Por lo tanto, actualizar los campos del modelo sin ejecutar migraciones para actualizar el esquema de la base de datos no genera errores.
Información Adicional
Para aprender a configurar una nueva aplicación que use Django MongoDB Backend, consulte el tutorial Introducción a Django MongoDB Backend.
Para obtener más información sobre cómo ejecutar operaciones de bases de datos utilizando Django MongoDB Backend, consulte la guía Realizar operaciones CRUD.
Para aprender más sobre cómo crear modelos de Backend Django MongoDB, consulta la guía Crear modelos para representar colecciones.