Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Migra Tu 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 de modelos

  • Indexes

  • Queries

  • migración

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.

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'
},
}

Para actualizar tus modelos para usar Django MongoDB Backend, realiza los siguientes cambios en las definiciones de tu modelo:

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

  2. Remueve las definiciones explícitas de 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 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.

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

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 anidado

  • EmbeddedModelArrayField: 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 modelo Nutrition embebido que representa la información sobre nutrición

  • reviews: Almacena múltiples modelos de Review incrustados 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)

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: La clase de índice de Django, que representa todos los tipos de índices no de búsqueda

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

  • VectorSearchIndex class: 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.

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

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.

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 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.

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 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.

Volver

Queryable Encryption

En esta página