Menu Docs
Página inicial do Docs
/ /

Migre seu aplicativo Djogo

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

  • Definições do modelo

  • Indexes

  • Consultas

  • Migrações

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.

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

Para atualizar seus modelos para usar o Backend do Django MongoDB , faça as seguintes alterações nas definições do seu modelo:

  1. Importe o módulo models de django.db em vez de djongo.

  2. Remova as definições explícitas de ObjectIdField, pois o Django MongoDB Backend cria automaticamente um campo _id do tipo ObjectIdField.

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

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"]
)

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 aninhado

  • EmbeddedModelArrayField: 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 modelo Nutrition incorporado que representa informações nutricionais

  • reviews: Armazena vários modelos Review incorporados 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)

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:

  • Index classe: classe de índice do Django , que representa todos os tipos de índice que não são de pesquisa

  • SearchIndex classe : A classe específica do Django MongoDB Backend para representar índices do MongoDB Search

  • VectorSearchIndex classe: 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.

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")
]

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.

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)

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.

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

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.

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.

Voltar

Transações

Nesta página