Overview
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.
Serializadores
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
ModelSerializerpara cualquier modelo que utiliceObjectIdAutoField.MongoModelSerializergenera automáticamente serializadores anidados para campos incrustados.EmbeddedModelSerializer: El serializador para las clases
EmbeddedModel. Dado queMongoModelSerializergestiona los campos incrustados automáticamente, defina unEmbeddedModelSerializersolo 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.
MongoModelSerializeraplica 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:
ArrayFieldEmbeddedModelFieldEmbeddedModelArrayFieldPolymorphicEmbeddedModelField(solo lectura)PolymorphicEmbeddedModelArrayField(solo lectura)ObjectIdFieldObjectIdAutoField
Requisitos previos
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.
Tutorial
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.
Actualice sus aplicaciones instaladas.
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 ]
Configure sus archivos.
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.
Serialice un modelo.
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:
from django_mongodb_extensions.rest_framework import MongoModelSerializer from .models import Viewer class ViewerSerializer(MongoModelSerializer): class Meta: model = Viewer fields = "__all__"
Serialice un modelo incrustado.
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:
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:
EmbeddedModelSerializerexcluye los campos de llave primaria a menos que los enumere explícitamente enMeta.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.
Vea la salida serializada de un modelo.
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'}
Ver la salida serializada de un modelo incrustado.
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']}
Próximos pasos
¡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.