Salve salve Pythonista
A validação de dados é essencial no desenvolvimento de aplicações robustas em Python.
Com o Pydantic, é possível personalizar a validação de dados utilizando tipos avançados e mecanismos poderosos.
Neste artigo, abordaremos como trabalhar com tipos complexos como Decimal, UUID e DateTime, utilizar campos opcionais e valores padrão, implementar validações personalizadas com validator, e introduzir o uso de Field para configurar validações e metadados.
Dominar esses tópicos é crucial para garantir a integridade e a consistência dos dados em suas aplicações Python.
Vá Direto ao Assunto…
- Trabalhando com Tipos Complexos: Decimal, UUID e DateTime
- Utilizando Campos Opcionais (Optional) e Valores Padrão
- Validação Personalizada com Validator
- Introdução ao Field para Configurar Validações e Metadados
Trabalhando com Tipos Complexos: Decimal, UUID e DateTime
O Pydantic oferece suporte a diversos tipos complexos que facilitam a manipulação de dados específicos.
Vamos explorar como utilizar Decimal, UUID e DateTime em seus modelos.
Utilizando Decimal
O tipo Decimal é útil para representar números com precisão decimal, evitando problemas de arredondamento comuns com floats.
1
2
3
4
5
6
from decimal import Decimal
from pydantic import BaseModel
class Produto(BaseModel):
nome: str
preco: Decimal
Explicação do código:
-
Importação: Importamos
Decimal
do módulodecimal
eBaseModel
do Pydantic. -
Definição da Classe: Criamos a classe
Produto
herdando deBaseModel
. -
Atributos: Definimos
nome
como string epreco
comoDecimal
.
Utilizando UUID
Para identificar objetos de forma única, o UUID (Universally Unique Identifier) é uma excelente escolha.
1
2
3
4
5
6
import uuid
from pydantic import BaseModel
class Usuario(BaseModel):
id: uuid.UUID
nome: str
Explicação do código:
-
Importação: Importamos
uuid
eBaseModel
. -
Definição da Classe: Criamos a classe
Usuario
comid
do tipoUUID
enome
como string.
Antes de continuar… Está curtindo esse conteúdo?
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?

Utilizando DateTime
O tipo DateTime permite trabalhar com data e hora de forma eficiente.
1
2
3
4
5
6
from datetime import datetime
from pydantic import BaseModel
class Evento(BaseModel):
nome: str
data_hora: datetime
Explicação do código:
-
Importação: Importamos
datetime
do módulodatetime
eBaseModel
. -
Definição da Classe: Criamos a classe
Evento
comnome
edata_hora
comoDateTime
.
Utilizando Campos Opcionais (Optional) e Valores Padrão
Nem todos os campos dos modelos precisam ser obrigatórios. O Pydantic facilita a definição de campos opcionais e a atribuição de valores padrão.
Campos Opcionais
Usamos Optional
para indicar que um campo pode ser ignorado ou ter valor None
.
1
2
3
4
5
6
from typing import Optional
from pydantic import BaseModel
class Cliente(BaseModel):
nome: str
email: Optional[str] = None
Explicação do código:
-
Importação: Importamos
Optional
detyping
eBaseModel
. -
Definição da Classe: Criamos
Cliente
comnome
obrigatório eemail
opcional, com valor padrãoNone
.
Valores Padrão
Atribuímos valores padrão diretamente nos campos para garantir que tenham um valor caso não sejam fornecidos.
1
2
3
4
5
from pydantic import BaseModel
class Configuracao(BaseModel):
ativo: bool = True
nivel_acesso: int = 1
Explicação do código:
-
Definição da Classe: Criamos
Configuracao
comativo
comoTrue
enivel_acesso
como1
por padrão.
Validação Personalizada com Validator
Embora o Pydantic valide automaticamente muitos tipos, às vezes é necessário implementar validações específicas. O decorador @validator
facilita essa customização.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pydantic import BaseModel, validator
from decimal import Decimal
class Pedido(BaseModel):
quantidade: int
preco_unitario: Decimal
@validator('quantidade')
def quantidade_positiva(cls, v):
if v <= 0:
raise ValueError('A quantidade deve ser positiva')
return v
@validator('preco_unitario')
def preco_valido(cls, v):
if v <= Decimal('0.00'):
raise ValueError('O preço unitário deve ser maior que zero')
return v
Explicação do código:
-
Definição da Classe: Criamos
Pedido
comquantidade
epreco_unitario
. -
Validador de Quantidade:
- O método
quantidade_positiva
verifica sequantidade
é maior que zero. - Se não, lança um
ValueError
.
- O método
-
Validador de Preço Unitário:
- O método
preco_valido
assegura quepreco_unitario
seja maior que zero. - Se não, lança um
ValueError
.
- O método
Esses validadores garantem que os dados atendam às regras de negócio definidas.
Introdução ao Field para Configurar Validações e Metadados
O Field do Pydantic permite configurar validações adicionais e adicionar metadados aos campos dos modelos, como descrições, títulos e exemplos.
1
2
3
4
5
6
7
from pydantic import BaseModel, Field
from uuid import UUID
class Produto(BaseModel):
id: UUID = Field(..., title="ID do Produto", description="Identificador único do produto")
nome: str = Field(..., min_length=3, max_length=50, example="Caneca")
preco: Decimal = Field(..., gt=0, description="Preço do produto em reais")
Explicação do código:
-
Importação: Importamos
Field
depydantic
, além de outros tipos necessários. -
Definição da Classe: Criamos
Produto
comid
,nome
epreco
. -
Uso de Field:
-
id
: Define título e descrição para documentação. -
nome
: Define comprimento mínimo e máximo, além de um exemplo. -
preco
: Define que o valor deve ser maior que zero e adiciona uma descrição.
-
O Field é especialmente útil para gerar documentação automática e garantir que os campos atendam a critérios específicos além da validação básica de tipos.
Conclusão
Neste artigo, exploramos como o Pydantic permite personalizar a validação de dados utilizando tipos avançados como Decimal, UUID e DateTime.
Aprendemos a definir campos opcionais e atribuir valores padrão, implementar validações personalizadas com o decorador @validator
, e utilizar o Field para configurar validações adicionais e metadados.
Essas ferramentas tornam o gerenciamento de dados em Python mais eficiente e seguro, fortalecendo a integridade das suas aplicações.
Com esses conhecimentos, você está pronto para criar modelos robustos e confiáveis em seus projetos Python.