Visão geral
Neste tutorial, você pode aprender a usar serializadores Django REST Framework de extensões Django MongoDB em seu projeto Django.
Django MongoDB Extensions é um pacote que contém ferramentas adicionais de desenvolvedor para o backend do Django MongoDB. Este tutorial mostra como usar os serializadores em Extensões do MongoDB do Django para representar campos específicos do MongoDB em sua API do Django REST Framework.
Observação
O Django REST Framework está disponível no Django MongoDB Extensions v0.3.0 e posterior.
Serializadores
O Django MongoDB Extensions fornece os seguintes serializadores no módulo django_mongodb_extensions.rest_framework:
MongoModelSerializer: O serializador de nível superior para modelos Django que contêm campos específicos do MongoDB. Use este serializador em vez do Django REST Framework
ModelSerializerpara qualquer modelo que useObjectIdAutoField.MongoModelSerializergera automaticamente serializadores aninhados para campos incorporados.EmbeddedModelSerializer: O serializador para classes
EmbeddedModel. ComoMongoModelSerializerlida com campos incorporados automaticamente, defina umEmbeddedModelSerializersomente quando quiser personalizar como um modelo incorporado é representado ou quando precisar gravar dados incorporados. Atribua a subclasse como um campo explícito no serializador do modelo pai.PolymorphicEmbeddedModelSerializer: O serializador para campos incorporados polimórficos.
MongoModelSerializeraplica este serializador automaticamente, para que você não o referencie diretamente. Os campos incorporados polimórficos são somente leitura.
MongoModelSerializer gera automaticamente os campos corretos do Django REST Framework para os seguintes tipos de campo específicos do MongoDB:
ArrayFieldEmbeddedModelFieldEmbeddedModelArrayFieldPolymorphicEmbeddedModelField(somente leitura)PolymorphicEmbeddedModelArrayField(somente leitura)ObjectIdFieldObjectIdAutoField
Pré-requisitos
Antes de iniciar este tutorial, crie um projeto Django que use o Django MongoDB Backend. Para criar um projeto, consulte o tutorial Introdução ao Django MongoDB Backend.
Tutorial
As etapas a seguir mostram como instalar o Django MongoDB Extensions e usar seus serializadores para modelar dados de filmes do MongoDB em sua API do Django REST Framework.
Atualize seus aplicativos instalados.
Navegue até o arquivo settings.py do seu projeto. Em seguida, adicione "django_mongodb_extensions" e "rest_framework" à configuração INSTALLED_APPS, conforme mostrado no exemplo a seguir:
INSTALLED_APPS = [ 'django_mongodb_extensions', 'rest_framework', # ... your other apps ]
Configure seus arquivos.
No tutorial Introdução, você criou um arquivo models.py que inclui o seguinte 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
Verifique se o diretório do seu aplicativo contém este arquivo. Em seguida, crie um arquivo serializers.py no mesmo diretório que seu arquivo models.py.
Serializar um modelo.
Para serializar um modelo que usa ObjectIdAutoField, defina um serializador que estenda MongoModelSerializer no seu arquivo serializers.py. O exemplo a seguir define um serializador para o modelo Viewer:
from django_mongodb_extensions.rest_framework import MongoModelSerializer from .models import Viewer class ViewerSerializer(MongoModelSerializer): class Meta: model = Viewer fields = "__all__"
Serializar um modelo incorporado.
Para serializar um campo que armazena um modelo incorporado, defina um serializador que estenda EmbeddedModelSerializer para o modelo incorporado e, em seguida, referencie-o a partir do serializador do modelo pai.
Para serializar o modelo Movie e seu modelo Award incorporado, atualize seu arquivo serializers.py para se parecer com o seguinte:
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__"
Observação
Comportamento do serializador de modelo incorporado
Ao serializar um modelo incorporado, observe o seguinte comportamento:
EmbeddedModelSerializerexclui campos de chave primária, a menos que você os liste explicitamente emMeta.fields.O método
to_internal_value()retorna instâncias de modelo em vez de dicionários.Você não pode salvar modelos incorporados diretamente. Em vez disso, salve-os por meio de seus modelos pai.
Visualize a saída serializada de um modelo.
Depois de definir um serializador, você pode usá-lo para converter uma instância de modelo em um dicionário de tipos de dados primitivos que o Django REST Framework pode renderizar como JSON.
Inicie uma shell Python executando o seguinte comando:
python manage.py shell
Em seguida, execute o seguinte código para fazer a query da coleção sample_mflix.users de um visualizador e serializar o 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
O atributo data contém a representação serializada do visualizador, que se assemelha à seguinte saída:
{'id': '...', 'name': 'Khal Drogo', 'email': 'jason_momoa@gameofthron.es'}
Exiba a saída serializada de um modelo incorporado.
Ao serializar um modelo que contém um modelo incorporado, o serializador aninha os campos do modelo incorporado na saída.
No shell do Python, execute o seguinte código para fazer query na coleção sample_mflix.movies para um filme e serializar o resultado:
from sample_mflix.models import Movie from sample_mflix.serializers import MovieSerializer movie = Movie.objects.first() serializer = MovieSerializer(movie) serializer.data
A saída serializada aninha o modelo incorporado awards dentro do filme, que se assemelha ao seguinte:
{'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 passos
Parabéns por concluir o tutorial do Django REST Framework! Agora você tem um aplicativo Django que usa serializadores de extensões do Django MongoDB para representar campos relacionados a filmes do MongoDB em uma API do Django REST Framework.
Para aprender mais sobre o Django REST Framework, consulte a documentação do Django REST Framework.
Para saber mais sobre o pacote Django MongoDB Extensions, consulte django-mongodb-extensions no PyPI e o repositório django-mongodb-extensions no GitHub.