Visão geral
Neste guia, você pode aprender como modificar seu projeto Djogo para usar o Django MongoDB Backend. O Djogo é uma biblioteca de terceiros que traduz queries SQL em queries do MongoDB Query Language (MQL), permitindo que você use o MongoDB como seu backend do Django para as versões 4.0 e anteriores do Django. No entanto, o Django MongoDB Backend é a integração oficialmente suportada e oferece suporte ao Django mais abrangente, acesso expandido aos recursos do MongoDB e compatibilidade com versões mais recentes do Django.
Este guia mostra como migrar um aplicação Djogo para o Django MongoDB Backend atualizando os seguintes componentes do aplicação :
Configurações do Banco de Dados
Para se conectar ao MongoDB usando o Django MongoDB Backend em vez do Djogo, modifique a configuração DATABASES no arquivo settings.py do seu aplicativo. Atualize o valor da chave ENGINE aninhada desta configuração de "djongo" para "django_mongodb_backend". Em seguida, especifique sua string de conexão na chave HOST aninhada em vez da chave CLIENT.
Dica
Para saber mais sobre a DATABASES configuração do, consulte o guia Configurar sua conexão de banco de dados.
Exemplo
O exemplo a seguir mostra como modificar sua configuração DATABASES para usar o backend Django MongoDB . Selecione a aba Djongo para ver a configuração inicial e selecione a aba Django MongoDB Backend para ver a configuração atualizada:
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' }, }
Definições do modelo
Para atualizar seus modelos para usar o Backend do Django MongoDB , faça as seguintes alterações nas definições do seu modelo:
Importe o módulo
modelsdedjango.dbem vez dedjongo.Remova as definições explícitas de
ObjectIdField, pois o Django MongoDB Backend cria automaticamente um campo_iddo tipoObjectIdField.Modifique a sintaxe da matriz específica do MongoDB e dos campos incorporados.
Importante
Tipos de campo
Djogo e Django MongoDB Backend provavelmente armazena campos Django no mesmo formato. No entanto, você pode enfrentar incompatibilidades devido a diferenças nos conversores de campo das integrações. Se encontrar algum problema, envie feedback usando a guia Rate this page no lado direito desta página.
Dica
Para saber mais modelos de backend do MongoDB do Django, consulte o guia Criar modelos .
Exemplo de modelo único
O exemplo a seguir mostra como atualizar uma classe de modelo denominada Recipe para compatibilidade com o Backend do Django MongoDB . Selecione a aba Djongo para ver o modelo inicial e selecione a aba Django MongoDB Backend para ver o modelo atualizado:
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 criar um objeto Recipe que armazena os campos anteriores, use o seguinte 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"] )
Exemplo de modelo incorporado
Ao usar Djogo, você pode usar um EmbeddedField para representar um documento MongoDB incorporado. Para definir um campo que armazena vários documentos incorporados, você pode usar um ArrayField.
O Django MongoDB Backend fornece os seguintes campos que representam documentos incorporados:
EmbeddedModelField: Armazena um modelo aninhadoEmbeddedModelArrayField: Armazena uma array de modelos aninhados
Dica
Polimorfismo do modelo
Você não pode usar campos Djogo para armazenar uma array de vários tipos de modelo. No entanto, o Django MongoDB Backend fornece os PolymorphicEmbeddedModelField PolymorphicEmbeddedModelArrayField campos e para suportar polimorfismo. Para saber mais, consulte Usar campos avançados no guia Criar modelos.
O exemplo seguinte mostra como atualizar um arquivo models.py que define um modelo Recipe contendo os seguintes campos de modelo embarcados:
nutrition: Armazena um modeloNutritionincorporado que representa informações nutricionaisreviews: Armazena vários modelosReviewincorporados que representam avaliações individuais de receitas
Selecione a aba Djongo para ver os modelos iniciais e selecione a aba Django MongoDB Backend para ver os modelos atualizados:
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)
Indexes
Para atualizar os índices em seu aplicativo Djogo para compatibilidade com o Django MongoDB Backend, você deve usar as classes de índice fornecidas pelo Django MongoDB Backend.
O Djogo fornece classes separadas para representar cada índice do MongoDB , incluindo classes para índices de campo único, índices compostos, índices de múltiplas chaves e muito mais.
O Django MongoDB Backend fornece as três classes a seguir para representar todos os tipos de índice:
Indexclasse: classe de índice do Django , que representa todos os tipos de índice que não são de pesquisaSearchIndexclasse : A classe específica do Django MongoDB Backend para representar índices do MongoDB SearchVectorSearchIndexclasse: A Django MongoDB classe específica do backend para representar índices do MongoDB Vector Search
Dica
Para saber mais sobre como usar o Django MongoDB Backend para criar índices, consulte o guia Criar índices.
Exemplo
O exemplo seguinte mostra como atualizar um índice composto em um modelo do Recipe. A implementação do Django MongoDB Backend também adiciona um índice do MongoDB Search, que o Djogo não suporta. Selecione a aba Djongo para ver o índice inicial e selecione a aba Django MongoDB Backend para ver os índices atualizados:
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") ]
Consultas
Você pode usar a API do Django QuerySet para consultar os modelos de backend do Djogo e do Django MongoDB . No entanto, a sintaxe é diferente para queries de modelo embarcado.
O Djogo trata modelos embarcados como dicionários Python, e você deve usar a sintaxe de dicionário Python para acessar ou modificar seus campos. O Django MongoDB Backend trata os modelos incorporados como modelos Django, então você usa a mesma sintaxe para interagir com seus campos e com todos os outros modelos.
Importante
Regressões de desempenho
As queries do Djogo e do Django MongoDB Backend geram diferentes queries MQL subjacentes, que podem ter implicações de desempenho. Ao migrar do Djogo para o Django MongoDB Backend, recomendamos que você monitore as alterações de desempenho para identificar possíveis regressões e registre um tíquete JIRA se descobrir alguma.
Dica
Para saber mais sobre como usar o Django MongoDB Backend para consultar seus modelos, consulte o guia Especificar uma query.
Exemplo
O exemplo a seguir mostra a diferença entre uma query Djogo e uma query de backend do MongoDB no Recipe modelo e seu nutrition campo de modelo embarcado, definido na seção Exemplo de Nutrition modelo embarcado. O código consulta o campo do modelo calories embarcado. Selecione a Djongo aba para ver a query inicial e selecione a Django MongoDB Backend aba para ver a query atualizada:
Recipe.objects.filter(nutrition__lt={'calories': 500})
Recipe.objects.filter(nutrition__calories__lt=500)
Transações
Tanto o Djogo quanto o Django MongoDB Backend oferecem suporte à funcionalidade de API de transação atômica do Django. No entanto, cada um deles fornece uma API personalizada para implementar essa funcionalidade. Você pode atualizar suas transações para compatibilidade com o Django MongoDB Backend modificando a instrução de importação do seu código.
Dica
Para saber mais sobre como usar o Django MongoDB Backend para executar transações, consulte o guia Transações e Sessões.
Exemplo
O exemplo a seguir mostra como atualizar seu código para importar a API de transação do Django MongoDB Backend. Selecione a aba Djongo para ver a declaração inicial e selecione a aba Django MongoDB Backend para ver a declaração atualizada:
from djongo import transaction
from django_mongodb_backend import transaction
Migrações
O Djogo não suporta migrações de banco de dados e não impõe validação de esquema por padrão. Se você definir a configuração ENFORCE_SCHEMA para True em seu arquivo settings.py, o Djogo imporá MigrationErrors quando os documentos recuperados tiverem valores de campo ausentes.
O Django MongoDB Backend suporta migrações de banco de dados com algumas limitações. Para saber mais sobre essas limitações, consulte Suporte à migração no guia Compatibilidade de recursos.
O Django MongoDB Backend não impõe validação de esquema. Como resultado, atualizar campos de modelo sem executar migrações para atualizar o esquema do banco de dados não gera erros.
Informações adicionais
Para saber como configurar um novo aplicação que usa o Django MongoDB Backend, consulte o tutorial de Introdução.
Para saber mais sobre como executar operações de banco de dados usando o Django MongoDB Backend, consulte o guia Executar operações CRUD.
Para saber mais sobre como criar modelos de backend do MongoDB do Django, consulte o guia Criar modelos.