Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Serializar datos de MongoDB con Django REST Framework

En este tutorial, puede aprender a usar los serializadores de Django REST Framework de Django MongoDB Extensions en su proyecto de Django.

Django MongoDB Extensions es un paquete que contiene herramientas adicionales para desarrolladores para el backend de Django MongoDB. Este tutorial le muestra cómo usar los serializadores en Django MongoDB Extensions para representar campos específicos de MongoDB en su API de Django REST Framework.

Nota

Django REST Framework está disponible en Django MongoDB Extensions v0.3.0 y versiones posteriores.

Django MongoDB Extensions proporciona los siguientes serializadores en el módulo django_mongodb_extensions.rest_framework:

  • MongoModelSerializer: El serializador de nivel superior para los modelos de Django que contienen campos específicos de MongoDB. Utilice este serializador en lugar del Django REST Framework ModelSerializer para cualquier modelo que utilice ObjectIdAutoField. MongoModelSerializer genera automáticamente serializadores anidados para campos incrustados.

  • EmbeddedModelSerializer: El serializador para las clases EmbeddedModel. Dado que MongoModelSerializer gestiona los campos incrustados automáticamente, defina un EmbeddedModelSerializer solo cuando desee personalizar cómo se representa un modelo incrustado o cuando necesite guardar datos incrustados. Asigne la subclase como un campo explícito en el serializador del modelo principal.

  • PolymorphicEmbeddedModelSerializer: El serializador para campos incrustados polimórficos. MongoModelSerializer aplica este serializador automáticamente, por lo que no lo referencia directamente. Los campos incrustados polimórficos son de solo lectura.

MongoModelSerializer genera automáticamente los campos correctos de Django REST Framework para los siguientes tipos de campo específicos de MongoDB:

  • ArrayField

  • EmbeddedModelField

  • EmbeddedModelArrayField

  • PolymorphicEmbeddedModelField (solo lectura)

  • PolymorphicEmbeddedModelArrayField (solo lectura)

  • ObjectIdField

  • ObjectIdAutoField

Antes de comenzar este tutorial, cree un Proyecto Django que utilice el backend de MongoDB de Django. Para crear un Proyecto, consulte el tutorial Comenzar con el backend de MongoDB de Django.

Los siguientes pasos muestran cómo instalar Django MongoDB Extensions y usar sus serializadores para modelar datos de películas de MongoDB en su API de Django REST Framework.

1

Ejecute el siguiente comando para instalar Django MongoDB Extensions con la dependencia rest_framework:

pip install "django-mongodb-extensions[rest_framework]"
2

Navegue hasta el archivo settings.py de su proyecto. A continuación, agregue "django_mongodb_extensions" y "rest_framework" a la configuración INSTALLED_APPS, como se muestra en el siguiente ejemplo:

INSTALLED_APPS = [
'django_mongodb_extensions',
'rest_framework',
# ... your other apps
]
3

En el tutorial Primeros pasos, creó un archivo models.py que incluye el siguiente código:

from django.db import models
from django.conf import settings
from django_mongodb_backend.fields import EmbeddedModelField, ArrayField
from django_mongodb_backend.models import EmbeddedModel
class Award(EmbeddedModel):
wins = models.IntegerField(default=0)
nominations = models.IntegerField(default=0)
text = models.CharField(max_length=100)
class Movie(models.Model):
title = models.CharField(max_length=200)
plot = models.TextField(blank=True)
runtime = models.IntegerField(default=0)
released = models.DateTimeField("release date", null=True, blank=True)
awards = EmbeddedModelField(Award, null=True, blank=True)
genres = ArrayField(models.CharField(max_length=100), null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title
class Viewer(models.Model):
name = models.CharField(max_length=100)
email = models.CharField(max_length=200)
class Meta:
db_table = "users"
managed = False
def __str__(self):
return self.name

Asegúrese de que el directorio de su aplicación contenga este archivo. Luego, cree un archivo serializers.py en el mismo directorio que su archivo models.py.

4

Para serializar un modelo que utiliza ObjectIdAutoField, defina un serializador que extienda MongoModelSerializer en su archivo serializers.py. El siguiente ejemplo define un serializador para el modelo Viewer:

serializers.py
from django_mongodb_extensions.rest_framework import MongoModelSerializer
from .models import Viewer
class ViewerSerializer(MongoModelSerializer):
class Meta:
model = Viewer
fields = "__all__"
5

Para serializar un campo que almacena un modelo incrustado, defina un serializador que extienda EmbeddedModelSerializer para el modelo incrustado y, a continuación, haga referencia a él desde el serializador del modelo principal.

Para serializar el modelo Movie y su modelo Award incrustado, actualiza tu archivo serializers.py para que se parezca al siguiente:

serializers.py
from django_mongodb_extensions.rest_framework import (
MongoModelSerializer,
EmbeddedModelSerializer,
)
from .models import (
Viewer,
Award,
Movie,
)
class ViewerSerializer(MongoModelSerializer):
class Meta:
model = Viewer
fields = "__all__"
class AwardSerializer(EmbeddedModelSerializer):
class Meta:
model = Award
fields = "__all__"
class MovieSerializer(MongoModelSerializer):
awards = AwardSerializer()
class Meta:
model = Movie
fields = "__all__"

Nota

Comportamiento del serializador de modelos incrustados

Cuando serialice un modelo incrustado, tenga en cuenta el siguiente comportamiento:

  • EmbeddedModelSerializer excluye los campos de llave primaria a menos que los enumere explícitamente en Meta.fields.

  • El método to_internal_value() devuelve instancias de modelo en lugar de diccionarios.

  • No puede guardar modelos incrustados directamente. Guárdelos a través de sus modelos principales.

6

Después de definir un serializador, puede usarlo para convertir una instancia de modelo en un diccionario de tipos de datos primitivos que Django REST Framework puede renderizar como JSON.

Inicie un shell de Python ejecutando el siguiente comando:

python manage.py shell

Luego, ejecute el siguiente código para query la colección sample_mflix.users en busca de un espectador y serialice el resultado:

from sample_mflix.models import Viewer
from sample_mflix.serializers import ViewerSerializer
viewer = Viewer.objects.get(email="jason_momoa@gameofthron.es")
serializer = ViewerSerializer(viewer)
serializer.data

El atributo data contiene la representación serializada del visor, que se parece a la siguiente salida:

{'id': '...', 'name': 'Khal Drogo', 'email': 'jason_momoa@gameofthron.es'}
7

Cuando serializa un modelo que contiene un modelo incrustado, el serializador anida los campos del modelo incrustado en la salida.

Desde su shell de Python, ejecute el siguiente código para query la colección sample_mflix.movies para una película y serializar el resultado:

from sample_mflix.models import Movie
from sample_mflix.serializers import MovieSerializer
movie = Movie.objects.first()
serializer = MovieSerializer(movie)
serializer.data

La salida serializada anida el modelo incrustado awards dentro de la película, que se parece a lo siguiente:

{'id': '...',
'title': 'The Great Train Robbery',
'plot': 'A group of bandits stage a brazen train hold-up...',
'runtime': 11,
'released': '1903-12-01T00:00:00Z',
'awards': {'wins': 1, 'nominations': 0, 'text': '1 win.'},
'genres': ['Short', 'Western']}

¡Felicidades por completar el tutorial de Django REST Framework! Ahora tiene una aplicación de Django que utiliza serializadores de extensiones de Django MongoDB para representar campos relacionados con películas de MongoDB en una API de Django REST Framework.

Para aprender más sobre Django REST Framework, consulte la documentación de Django REST Framework.

Para obtener más información sobre el paquete Django MongoDB Extensions, consulta django-mongodb-extensions en PyPI y el django-mongodb-extensions repositorio en GitHub.