Modelos no Django
Os modelos são a essência de qualquer ORM. Um modelo é uma representação de algum dado com o qual o aplicativo trabalhará. Isso pode ser uma pessoa, um produto, uma categoria ou qualquer outra forma de dados de que o aplicativo precisa.
Criar um modelo
No Django, um modelo é qualquer classe que herda uma coleção de funcionalidades de django.models.Model
. A coleção inclui métodos que permitem consultar o banco de dados, criar entradas e salvar atualizações. Você também pode definir campos, definir metadados e estabelecer relações entre modelos.
Se você quiser criar dois modelos, Product
e Category
, adicione duas classes:
from django.db import models
class Product(models.Model):
# details would go here
pass
class Category(models.Model):
# details would go here
pass
Adicionar métodos
Antes de discutirmos como configurar os dados para seu modelo, será importante destacar o fato de que um modelo é uma classe Python. Como resultado, você pode adicionar métodos e substituir aqueles fornecido por Django.models.Model
ou aqueles inerentes a todos os objetos do Python.
Um método em particular de destaque é __str__
. Você usará esse método para exibir um objeto se nenhum campo for especificado. Se Product
tiver um campo name
(que veremos daqui a pouco), você poderá retorná-lo como a representação de cadeia de caracteres padrão de Product
pela substituição de __str__
.
class Product(models.Model):
name = models.TextField()
def __str__(self):
return self.name
Adicionar campos
Os campos definem a estrutura de dados de um modelo. Os campos podem incluir o nome de um item, uma data de criação, um preço ou qualquer outro dado que o modelo precisa armazenar.
Diferentes dados têm tipos de dados diferentes, regras de validação e outras formas de metadados. O ORM do Django contém um conjunto avançado de opções para configurar os campos dos modelos conforme suas especificações. Ele é extensível, de modo que você possa criar regras próprias, conforme necessário.
Como definir o tipo de campo
O principal metadado de todos os campos é o tipo de dados que ele armazenará, como uma cadeia de caracteres ou um número. Os tipos de campo são mapeados para um tipo de banco de dados e um tipo de controle de formulário HTML (como uma caixa de texto ou uma caixa de seleção). O Django inclui vários tipos de campo, incluindo:
CharField
: uma linha de texto.TextField
: várias linhas de texto.BooleanField
: uma opção booliana true/false.DateField
: uma data.TimeField
: uma hora.DateTimeField
: uma data e uma hora.URLField
: uma URL.IntegerField
: um inteiro.DecimalField
: um número decimal de precisão fixa.
Para adicionar campos às classes Product
e Category
, podemos ter o seguinte código:
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
class Category(models.Model):
name = models.TextField()
Opções de campo
Você pode usar opções de campo para adicionar metadados e permitir valores nulos ou em branco ou marcar um campo como exclusivo. Também pode definir opções de validação e fornecer mensagens personalizadas para erros de validação.
Assim como acontece com os tipos de campo, as opções de campo são mapeadas para as configurações apropriadas no banco de dados. As regras serão impostas em todos os formulários que o Django gerar em seu nome.
As opções de campo são transmitidas para a função do próprio campo. Campos diferentes podem dar suporte a diferentes opções. Algumas das opções mais comuns são:
null
- Opção booliana para permitir valores nulos.
- O padrão é
False
.
blank
- Opção booliana para permitir valores em branco.
- O padrão é
False
.
default
- Permite a configuração de um valor padrão se um valor para o campo não foi fornecido.
- Se você quiser definir o valor padrão para um banco de dados
null
, definadefault
comoNone
.
unique
- Esse campo precisa conter um valor exclusivo.
- O padrão é
False
.
min_length
emax_length
- Usado com tipos de cadeia de caracteres para identificar o tamanho mínimo e máximo da cadeia de caracteres.
- O padrão é
None
.
min_value
emax_value
- Usado com tipos de número para identificar os valores mínimo e máximo.
auto_now
eauto_now_add
.- Usado com tipos de data/hora para indicar se a hora atual deve ser usada.
auto_now
sempre definirá o campo como a hora atual durante o salvamento, o que é útil para camposlast_update
.auto_now_add
o definirá o campo para a hora atual durante a criação, o que é útil para camposcreation_date
.
Observação
Os valores null
e blank
podem parecer semelhantes, mas significam coisas diferentes em termos de banco de dados. null
é a falta de um valor, enquanto blank
é especificamente um valor vazio.
Para adicionar opções aos modelos, o código pode ser assim:
from django.db import models
class Product(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
price = models.DecimalField(min_value=0.99, max_value=1000)
creation_date = models.DateField(auto_now_add=True)
class Category(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
Chaves e relações
Uma prática padrão em bancos de dados relacionais é que cada linha em uma tabela tenha uma chave primária, normalmente um inteiro incrementado automaticamente. O ORM do Django adicionará essa chave automaticamente a todos os modelos que você criar, adicionando um campo chamado id
.
Se você quiser substituir esse comportamento, poderá definir o campo que deseja que seja a chave primária. No entanto, você deve confiar no campo id
do Django na maioria das situações.
Os bancos de dados relacionais também têm relações entre tabelas. Um produto tem uma categoria, um funcionário tem um gerente e um carro tem um fabricante. O ORM do Django dá suporte a todas as relações que você pode querer criar entre os modelos.
A relação mais comum é "um-para-muitos", tecnicamente conhecida como uma relação de chave estrangeira. Em uma relação de chave estrangeira, vários itens compartilham um só atributo. Vários produtos são agrupados em uma só categoria, por exemplo. Para modelar essa relação, use o campo ForeignKey
.
Para criar a relação, adicione o campo ForeignKey
ao objeto filho. Se os produtos estiverem agrupados em categorias, você adicionará a propriedade category
à classe Product
e definirá o tipo como ForeignKey
.
O Django adiciona automaticamente uma propriedade ao pai para fornecer acesso a todos os filhos chamados <child>_set
, em que <child>
é o nome do objeto filho. Em nosso exemplo, Category
adicionará product_set
automaticamente para fornecer acesso a todos os produtos na categoria.
ForeignKey
tem um parâmetro obrigatório, on_delete
. Esse parâmetro instrui o Django sobre o que fazer se o pai for excluído. Ou seja, se excluirmos uma categoria, o que deverá acontecer aos produtos dessa categoria?
As duas opções mais comuns são:
CASCADE
, que excluirá todos os produtos se uma categoria for excluída no exemplo.PROTECT
, que retornará um erro se tentarmos excluir uma categoria que contém produtos.
Observação
Na maioria dos casos, o ideal será usar PROTECT
.
Para atualizar o modelo a fim de criar a relação, podemos usar o seguinte código:
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
category = models.ForeignKey(
'Category', #The name of the model
on_delete=models.PROTECT
)
class Category(models.Model):
name = models.TextField()
# product_set will be automatically created