Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Serializar dados do MongoDB com o Django REST Framework

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.

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 ModelSerializer para qualquer modelo que use ObjectIdAutoField. MongoModelSerializer gera automaticamente serializadores aninhados para campos incorporados.

  • EmbeddedModelSerializer: O serializador para classes EmbeddedModel. Como MongoModelSerializer lida com campos incorporados automaticamente, defina um EmbeddedModelSerializer somente 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. MongoModelSerializer aplica 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:

  • ArrayField

  • EmbeddedModelField

  • EmbeddedModelArrayField

  • PolymorphicEmbeddedModelField (somente leitura)

  • PolymorphicEmbeddedModelArrayField (somente leitura)

  • ObjectIdField

  • ObjectIdAutoField

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.

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.

1

Execute o seguinte comando para instalar as Extensões do MongoDB do Django com a dependência rest_framework :

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

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
]
3

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.

4

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:

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

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__"

Observação

Comportamento do serializador de modelo incorporado

Ao serializar um modelo incorporado, observe o seguinte comportamento:

  • EmbeddedModelSerializer exclui campos de chave primária, a menos que você os liste explicitamente em Meta.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.

6

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

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

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.