Visão geral
Neste guia, você pode aprender como criar modelos Django que representam coleções MongoDB . Modelos são classes do Python que definem a estrutura dos seus dados. Ao usar o Django MongoDB Backend, você pode mapear cada modelo para uma coleção MongoDB e interagir com os documentos da coleção usando objetos de modelo.
Dica
Para saber mais sobre os modelos do Django, consulte Model na documentação do Django.
Campos suportados
Esta seção descreve o suporte do Django MongoDB Backend para os seguintes campos, que você pode incluir em seus modelos:
Campos do Django
A tabela a seguir descreve os campos de modelo do Django que o Django MongoDB Backend suporta:
tipo de campo | Descrição |
|---|---|
| Armazena dados binários brutos. |
| Armazena valores booleanos ( |
| Armazena valores de string. Para armazenar valores de texto mais longos, utilize |
| Armazena valores de data em instâncias do Python |
| Armazena valores de data e hora em instâncias do Python |
| Armazena valores decimais. |
| Armazena valores representando períodos de tempo em instâncias do Python |
| Armazena |
| Stores file values. |
| Armazena valores |
| Stores float values. |
| Armazena um endereço IPv4 ou IPv6 no formato de string. |
| Armazena um valor |
| Armazena valores inteiros de até 64 bits de tamanho. |
| Armazena dados JSON. Para saber mais sobre este campo, consulte a seção Armazenar Dados JSON neste guia. |
| Armazena valores inteiros positivos com até 64 bits de tamanho. |
| Armazena valores inteiros positivos com até 32 bits de tamanho. |
| Armazena um rótulo de texto curto, geralmente para valores de URL . |
| Armazena valores inteiros de até 32 bits de tamanho. |
| Armazena valores de texto grandes. |
| Armazena um valor |
| Armazena instâncias da classe |
Campos JSON do MongoDB
O MongoDB organiza e armazena documentos em uma representação binária chamada BSON que permite o processamento de dados flexível.
Dica
Para saber mais sobre como o MongoDB armazena dados BSON, consulte tipos de BSON no manual do MongoDB Server .
A tabela a seguir descreve os tipos de campo BSON compatíveis e seus equivalentes no Django MongoDB Backend que você pode usar em seus modelos do Django:
Tipo de campo BSON | Tipo de campo de backend do Django MongoDB | Descrição do JSON |
|---|---|---|
|
| Armazena valores de array. Para saber mais sobre como usar esse campo com o Django MongoDB Backend, consulte a seção Armazenar dados de array neste guia. |
|
| Armazena um ou vários documentos incorporados. Para saber mais sobre como usar esses campos com o Django MongoDB Backend, consulte as seções Armazenar dados de modelo incorporados e Armazenar dados de array de modelos incorporados . |
|
| Armazena identificadores exclusivos de 12bytes que o MongoDB usa como chaves primárias. |
|
| Armazena dados binários. |
|
| Armazena valores |
|
| Armazena datas e horas em milissegundos desde a época do Unix, ou janeiro de 1 de 1970. |
|
| Armazena valores decimais de 28bits. |
|
| Armazena valores de ponto flutuante. |
|
| Armazena números inteiros assinados de 32bits. |
|
| Armazena números inteiros assinados de 64bits. |
|
| Armazena valores de string codificados em UTF-8. |
Definir um modelo
Para criar um modelo que represente uma collection do MongoDB , adicione as definições da classe do modelo ao arquivo models.py do aplicativo. Em sua classe de modelo, especifique os campos que você deseja armazenar e inclua quaisquer metadados de modelo em uma classe Meta interna. Você também pode usar o método __str__() para definir a representação de string do seu modelo. Use a seguinte sintaxe para definir um modelo:
class <Model name>(models.Model): <field name> = <data type> # Include additional fields here class Meta: # Include metadata here def __str__(self): # Include logic for displaying your model as a string here
Dica
Para saber mais sobre as opções de metadados que você pode especificar na classe Meta, consulte Opções de metadados do modelo na documentação do Django.
Para utilizar seus modelos, você deve adicioná-los ao arquivo settings.py do seu projeto. Edite o valor INSTALLED_APPS para incluir o nome do módulo que armazena seu arquivo models.py, conforme mostrado no código a seguir:
INSTALLED_APPS = [ '<application module>', # Include other app modules here ]
Por fim, execute os seguintes comandos de migração de banco de dados a partir do diretório raiz do seu projeto para criar coleções MongoDB para seus modelos ou utilize coleções existentes para armazenar dados do modelo:
python manage.py makemigrations <application name> python manage.py migrate
Exemplo
Este arquivo models.py de amostra define uma classe de modelo Movie que inclui as seguintes informações:
Lista de campos que representam dados de filme.
Metaclasse que define a opçãodb_tablecomomovies. Isto instrui o Backend do Django MongoDB a utilizar este modelo para representar asample_mflix.moviescoleção do a partir dos conjuntos de dados de amostra do Atlas .A classe
Metatambém define a opçãomanagedcomoFalse, instruindo o Django MongoDB Backend a não criar uma nova collection para o modelo.__str__()que define a representação de string do modelo como seu valor de campotitle.
from django.db import models 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) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Dica
Para saber mais sobre os campos usados na definição da classe de modelo, consulte a seção Campos compatíveis deste guia.
Usar campos avançados
Esta seção mostra como usar os seguintes campos em seus modelos Django:
Store JSON Data
Você pode utilizar um JSONField em seu modelo para armazenar objetos JSON. O JSON é um formato legível por humanos para troca de dados, e os objetos JSON são contêineres de dados que mapeiam chaves de string para valores. O MongoDB fornece o tipo de campo Object para armazenar dados JSON em documentos e armazena internamente esses dados no formato BSON ou Binary JSON.
Observação
Você também pode utilizar modelos embarcados e modelos embarcados polimórficos para representar um MongoDB Object.
Exemplo
O exemplo a seguir adiciona um JSONField valor ao modelo criado no exemplo Definir um modelo neste guia. O novo campo, chamado imdb, armazena dados JSON que representam classificações de usuários para cada objeto Movie:
from django.db import models 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) imdb = models.JSONField(null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Dica
Para aprender como consultar dados armazenados em um JSONField, consulte Consultar Valores JSON no guia Especificar uma query.
Limitações
O suporte do Django MongoDB Backend para JSONField tem as seguintes limitações:
Se você definir o valor do campo como
None, o Backend do Django MongoDB armazenará seu valor como um valor SQLNULL. Como alternativa, você pode definir o valorJSONFieldcomoValue(None, JSONField()), que representa onullescalar JSON. No entanto, não há como distinguir entre o SQLNULLe o JSONnullao fazer query.Algumas queries que utilizam objetos
Qpodem não retornar os resultados esperados, especialmente ao utilizar o métodoQuerySet.exclude().Ao executar query de campos que têm um valor de
None, o Django MongoDB Backend retorna incorretamente documentos nos quais o campo não existe.
Armazenar dados de array
Você pode utilizar um ArrayField em seu modelo para armazenar uma lista de dados. Para criar um ArrayField, utilize o construtor de classe ArrayField() e passe os seguintes argumentos:
base_field: especifica o tipo de dados subjacente de cada valor armazenado na array. Você não pode especificarEmbeddedModelFieldouFileFieldcomo o tipo de campo base.size: (Opcional) Especifica o tamanho máximo da array.options: (Opcional) Especifica as opções de campo do Django. Para visualizar uma lista de opções disponíveis, consulte Opções de campo na documentação do Django.
Dica
Você pode armazenar uma array de valores de array em um ArrayField usando a seguinte sintaxe:
my_array = ArrayField( ArrayField( base_field, # ... Additional arguments ), )
Exemplo
O exemplo a seguir adiciona um ArrayField valor de ao modelo criado no exemplo Definir um modelo neste guia. O novo campo, chamado genres, armazena uma lista de CharField valores que representam gêneros de filmes e podem armazenar um máximo de 5 valores:
from django.db import models from django_mongodb_backend.fields import ArrayField 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) genres = ArrayField( models.CharField(max_length=100), size=5, null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Dica
Para aprender como consultar dados armazenados em um ArrayField, consulte Valores de Matriz de Query no guia Especificar uma query.
Armazenar dados de modelo incorporados
Você pode usar um EmbeddedModelField para representar um MongoDB Object, que armazena um valor de documento aninhado. Este tipo permite que um modelo armazene um modelo separado em um de seus campos. Para criar um EmbeddedModelField, defina uma classe de modelo embarcado como uma subclasse do modelo abstrato EmbeddedModel. Em seguida, crie um campo na classe do modelo base usando o construtor EmbeddedModelField() e passe os seguintes argumentos:
embedded_model: especifica a classe de modelo a ser armazenada.options: (Opcional) Especifica as opções de campo do Django. Para visualizar uma lista de opções disponíveis, consulte Opções de campo na documentação do Django.
Importante
O comando makemigrations Django não detecta alterações em modelos incorporados. Se você fizer alterações na classe do modelo embarcado, o modelo armazenado no EmbeddedModelField não refletirá as alterações.
Exemplo
Este exemplo adiciona um EmbeddedModelField valor ao modelo criado no exemplo Definir um modelo neste guia. O novo campo, chamado awards, armazena um modelo Award incorporado como seu valor. O seguinte código define o modelo Award e modifica o modelo Movie para incluir o EmbeddedModelField:
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelField 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) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Dica
Para aprender como consultar dados armazenados em um EmbeddedModelField, consulte Consultar Valores de Modelo Incorporados no guia Especificar uma Query.
Armazenar dados de array do modelo incorporado
Você pode usar um EmbeddedModelArrayField para representar um campo de documento do MongoDB que armazena uma array de documentos em um relacionamento de um para muitos. Cada documento na array corresponde a um valor Django MongoDB Backend EmbeddedModelField. Para criar um EmbeddedModelArrayField, utilize o construtor de classe EmbeddedModelArrayField() e passe os seguintes argumentos:
embedded_model: Especifica o modelo armazenado em cada item da array.max_size: (Opcional) Especifica o tamanho máximo da array.
Exemplo
Este exemplo adiciona um valor EmbeddedModelArrayField ao modelo criado no exemplo Definir um modelo neste guia. Este campo cast armazena uma array de modelos Actor incorporados. O seguinte código define o modelo Actor e modifica o modelo Movie para incluir o EmbeddedModelArrayField:
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelArrayField class Actor(EmbeddedModel): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) role = 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) cast = EmbeddedModelArrayField(Actor, null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Armazenar dados de modelo incorporado polimórfico
Você pode usar um PolymorphicEmbeddedModelField para representar um campo de documento MongoDB que pode armazenar vários tipos de documentos incorporados. Cada documento incorporado é representado por uma classe de modelo do Django MongoDB Backend .
Para criar um PolymorphicEmbeddedModelField, passe o argumento embedded_models para o construtor da classe PolymorphicEmbeddedModelField() . Este argumento especifica uma lista de classes de modelo que o campo pode armazenar.
Exemplo
Este exemplo adiciona um valor PolymorphicEmbeddedModelField ao modelo criado no exemplo Definir um modelo neste guia. Este campo do awards pode armazenar um modelo embarcado do tipo Oscars ou GoldenGlobes. Cada modelo incorporado contém informações sobre todos os prêmios Oscar ou Globo de Dourado que um filme ganha.
O seguinte código define os modelos embarcados Oscars e GoldenGlobes e, em seguida, modifica o modelo Movie para incluir o PolymorphicEmbeddedModelField:
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import PolymorphicEmbeddedModelField class Oscars(EmbeddedModel): wins = models.IntegerField(default=0) nominations = models.IntegerField(default=0) best_picture = models.BooleanField(default=False) class GoldenGlobes(EmbeddedModel): wins = models.IntegerField(default=0) nominations = models.IntegerField(default=0) 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 = PolymorphicEmbeddedModelField(["Oscars", "GoldenGlobes"], null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Dica
Para aprender como executar queries de dados armazenados em um PolymorphicEmbeddedModelField, consulte Consultar valores de modelo incorporados polimórficos no guia Especificar uma query.
Armazenar dados de array de modelo polimórfico incorporado
Você pode usar um PolymorphicEmbeddedModelArrayField para representar um campo de documento MongoDB que pode armazenar vários tipos de documentos incorporados. Este campo é semelhante ao PolymorphicEmbeddedModelField, mas armazena uma array de documentos incorporados em vez de um único documento. Cada documento incorporado na array é representado por uma classe de modelo Django MongoDB Backend .
Para criar um PolymorphicEmbeddedModelArrayField, passe os seguintes argumentos para o construtor da classe PolymorphicEmbeddedModelArrayField():
embedded_models: Especifica as classes de modelo que o campo pode armazenarmax_size: (Opcional) Especifica o tamanho máximo da array
Exemplo
Este exemplo adiciona um valor PolymorphicEmbeddedModelArrayField ao modelo criado no exemplo Definir um modelo neste guia. Este campo do awards pode armazenar uma lista de modelos embarcados do tipo Oscar ou GoldenGlobe. Cada modelo incorporado contém informações sobre um dos prêmios Oscar ou Globo de Dourado que um filme lhe rendeu.
O seguinte código define os modelos embarcados Oscar e GoldenGlobe e, em seguida, modifica o modelo Movie para incluir o PolymorphicEmbeddedModelArrayField:
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import PolymorphicEmbeddedModelArrayField class Oscar(EmbeddedModel): category = models.CharField(max_length=200) year = models.IntegerField(default=0) class GoldenGlobe(EmbeddedModel): category = models.CharField(max_length=200) year = models.IntegerField(default=0) 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 = PolymorphicEmbeddedModelArrayField(["Oscar", "GoldenGlobe"], null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title
Dica
Para saber como executar queries de dados armazenados em um PolymorphicEmbeddedModelArrayField, consulte Consultar valores de array de modelo polimórfico incorporado no guia Especificar uma query.
Informações adicionais
Para saber como usar seus modelos para executar operações de banco de dados , consulte os guias Interagir com dados.
Para saber mais sobre os campos do Django, consulte a referência de campo do Modelo na documentação do Django.