Docs Menu
Docs Home
/ /

Migrar su aplicación Djongo

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

  • Definiciones del modelo

  • Indexes

  • Queries

  • Migraciones

Para conectarse a MongoDB usando Django MongoDB Backend en lugar 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íapara configurar la conexión a su base de datos.

El siguiente ejemplo muestra cómo modificar la configuración DATABASES para usar Django MongoDB Backend. Seleccione 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'
},
}

Para actualizar sus modelos para usar Django MongoDB Backend, realice los siguientes cambios en las definiciones de sus modelos:

  1. Importe el módulo models desde django.db en lugar de desde djongo.

  2. Elimine las definiciones explícitas ObjectIdField, porque Django MongoDB Backend crea automáticamente un campo _id de tipo ObjectIdField.

  3. Modificar la sintaxis de la matriz específica de MongoDB y los campos incrustados.

Importante

Tipos de Campos

Es probable que Djongo y Django MongoDB Backend almacenen los campos de Django en el mismo formato. Sin embargo, podría experimentar incompatibilidades debido a las diferencias en los convertidores de campos de las integraciones. Si tiene algún problema, puede enviar sus comentarios mediante la pestaña Rate this page a la derecha de esta página.

Tip

Para obtener más información sobre los modelos Backend de Django MongoDB, consulte la guía Crear modelos.

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, utilice 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"]
)

Al usar Djongo, puede usar un EmbeddedField para representar un documento MongoDB incrustado. Para definir un campo que almacene varios documentos incrustados, puede usar un ArrayField.

Django MongoDB Backend proporciona los siguientes campos que representan documentos incrustados:

  • EmbeddedModelField:Almacena un modelo anidado

  • EmbeddedModelArrayField: Almacena un arreglo de modelos anidados

Tip

Polimorfismo del modelo

No se pueden usar campos de Djongo para almacenar una matriz de varios tipos de modelos. Sin embargo, Django MongoDB Backend proporciona los PolymorphicEmbeddedModelField PolymorphicEmbeddedModelArrayField campos y para admitir el polimorfismo. Para obtener más información, consulte "Usar campos avanzados" en la guía "Crear modelos".

El siguiente ejemplo muestra cómo actualizar un archivo models.py que define un modelo Recipe que contiene los siguientes campos de modelo integrados:

  • nutrition: almacena un modelo Nutrition embebido que representa la información sobre nutrición

  • reviews: Almacena múltiples modelos Review integrados que representan revisiones de recetas individuales

Seleccione la pestaña Djongo para ver los modelos iniciales y seleccione 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)

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:

  • Index clase: clase de índice de Django, que representa todos los tipos de índice que no son de búsqueda

  • SearchIndex clase: Una clase específica de Django MongoDB Backend para representar los índices de búsqueda de MongoDB

  • VectorSearchIndex clase: Una clase específica de Django MongoDB Backend para representar índices de búsqueda vectorial de MongoDB

Tip

Para obtener más información sobre cómo usar Django MongoDB Backend para crear índices, consulte la guía Crear índices.

El siguiente ejemplo muestra cómo actualizar un índice compuesto en un modelo Recipe. La implementación del backend MongoDB de Django también añade un índice de búsqueda MongoDB, que Django no admite. Seleccione la pestaña Djongo para ver el índice inicial y 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")
]

Puedes usar la API de Django QuerySet para consultar los modelos backend de Djongo y Django MongoDB. Sin embargo, la sintaxis difiere para las consultas de modelos incrustados.

Djongo trata los modelos incrustados 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 incrustados como modelos de Django, por lo que se usa la misma sintaxis para interactuar con sus campos que con 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.

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)

Tanto Djongo como el backend de Django MongoDB son compatibles con 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 el backend de Django MongoDB modificando la declaración de importación de 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.

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

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.

Para aprender a configurar una nueva aplicación que utiliza Django MongoDB Backend, consulte el tutorial Primeros pasos.

Para obtener más información sobre cómo ejecutar operaciones de base de datos mediante Django MongoDB Backend, consulte la guía Realizar operaciones CRUD.

Para obtener más información sobre la creación de modelos Django MongoDB Backend, consulte la guía Crear modelos.

Volver

Queryable Encryption

En esta página