0% acharam este documento útil (0 voto)
15 visualizações60 páginas

Django

O documento explica como utilizar o Docker para executar o Portainer e detalha como relacionar tabelas no Django usando ForeignKey, OneToOneField e ManyToManyField. Exemplos práticos são fornecidos, incluindo a criação de modelos de Autor e Livro, e como o Django REST Framework (DRF) representa esses relacionamentos em JSON. Além disso, aborda a importância do parâmetro on_delete nas relações e fornece dicas sobre como planejar relacionamentos em APIs REST.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
15 visualizações60 páginas

Django

O documento explica como utilizar o Docker para executar o Portainer e detalha como relacionar tabelas no Django usando ForeignKey, OneToOneField e ManyToManyField. Exemplos práticos são fornecidos, incluindo a criação de modelos de Autor e Livro, e como o Django REST Framework (DRF) representa esses relacionamentos em JSON. Além disso, aborda a importância do parâmetro on_delete nas relações e fornece dicas sobre como planejar relacionamentos em APIs REST.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Explicação do comando Docker (Portainer)

O comando utilizado para executar o Portainer foi

docker run -d \

-p 9000:9000 \

-p 8000:8000 \

--name portainer \

--restart=always \

-v /var/run/[Link]:/var/run/[Link] \

-v portainer_data:/data \

portainer/portainer-ce
Relacionamento no Django
No Django, quando você quer relacionar duas tabelas, você usa ForeignKey,
OneToOneField ou ManyToManyField.

No teu exemplo de livros e autores:

class Autor([Link]):
nome = [Link](max_length=100)

class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])
O que acontece:

1. Livro é a tabela “filha”


o Cada livro está relacionado a um autor específico.
2. Autor é a tabela “pai”
o Um autor pode ter vários livros.
3. O Django cria uma chave estrangeira (foreign key) na tabela Livro que aponta para a
tabela Autor.

🔹 Visualizando no banco de dados

Se você usar SQLite, PostgreSQL ou MySQL, a tabela Livro vai ter algo assim:

id titulo autor_id

1 “Python” 1

2 “Django DRF” 1

 O campo autor_id é a foreign key


 Ele aponta para o ID da tabela Autor

Tabela Autor:

id nome

1 João Silva

2 Maria

💡 Veja que o Livro usa autor_id para saber quem é o autor.


🔹 Como o DRF usa esse relacionamento

No serializer:

class LivroSerializer([Link]):
class Meta:
model = Livro
fields = '__all__'

Se você fizer um GET:

{
"id": 1,
"titulo": "Python",
"autor": 1
}

 autor mostra o ID do autor


 Você também pode exibir o nome do autor usando nested serializer:

class AutorSerializer([Link]):
class Meta:
model = Autor
fields = '__all__'

class LivroSerializer([Link]):
autor = AutorSerializer() # mostra os dados do autor
class Meta:
model = Livro
fields = '__all__'

Resultado:

{
"id": 1,
"titulo": "Python",
"autor": {
"id": 1,
"nome": "João Silva"
}
}

🔹 Resumo do relacionamento

 ForeignKey cria um relacionamento de um-para-muitos (um autor → muitos livros)


 on_delete define o que acontece quando a tabela “pai” é deletada
 DRF consegue representar isso em JSON automaticamente
relacionamentos entre modelos. Vou explicar passo a passo. 👇

🔹 O que é on_delete?
Quando você cria um campo ForeignKey em um modelo, ele cria um relacionamento
entre tabelas.

O on_delete define o que acontece com os registros relacionados quando o registro


"pai" é deletado.

🔹 Sintaxe básica
from [Link] import models

class Autor([Link]):
nome = [Link](max_length=100)

class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])

🔹 Tipos de on_delete
Opção O que faz

CASCADE Apaga os livros quando o autor for deletado

PROTECT Impede a exclusão do autor se houver livros relacionados

SET_NULL Coloca o campo como NULL quando o autor for deletado

SET_DEFAULT Define um valor padrão quando o autor for deletado

SET(...) Define outro valor ou função ao deletar

DO_NOTHING Não faz nada (atenção: pode gerar erro de integridade)

🔹 Exemplo com SET_NULL


class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=models.SET_NULL,
null=True)

👉 Quando um autor é apagado, o livro continua, mas o campo autor fica vazio (NULL).
🔹 Exemplo com PROTECT
class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])

👉 Tenta apagar o autor e Django vai impedir se existir algum livro relacionado.

🔹 Por que é importante?


 Evita perda de dados acidental
 Mantém integridade do banco de dados
 Permite controlar como registros relacionados se comportam

💡 Dica profissional:
Se tu estiveres criando uma API REST com DRF, sempre planeja relacionamentos
com on_delete antes de popular o banco, especialmente se tiver muitos ForeignKey
para outras tabelas.

Se quiser, posso criar um exemplo completo de livros e autores no DRF usando


on_delete e mostrar como a API se comporta ao deletar registros 🔥

Queres que eu faça isso?

e como que ele fez o relaciomanento

Ah! Agora a tua dúvida é como o Django cria o relacionamento entre tabelas usando
ForeignKey (e, portanto, on_delete). Vou explicar detalhadamente. 👇

🔹 Relacionamento no Django
No Django, quando você quer relacionar duas tabelas, você usa ForeignKey,
OneToOneField ou ManyToManyField.

No teu exemplo de livros e autores:

class Autor([Link]):
nome = [Link](max_length=100)

class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])
O que acontece:

1. Livro é a tabela “filha”


o Cada livro está relacionado a um autor específico.
2. Autor é a tabela “pai”
o Um autor pode ter vários livros.
3. O Django cria uma chave estrangeira (foreign key) na tabela Livro que aponta para a
tabela Autor.

🔹 Visualizando no banco de dados

Se você usar SQLite, PostgreSQL ou MySQL, a tabela Livro vai ter algo assim:

id titulo autor_id

1 “Python” 1

2 “Django DRF” 1

 O campo autor_id é a foreign key


 Ele aponta para o ID da tabela Autor

Tabela Autor:

id nome

1 João Silva

2 Maria

💡 Veja que o Livro usa autor_id para saber quem é o autor.

🔹 Como o DRF usa esse relacionamento

No serializer:

class LivroSerializer([Link]):
class Meta:
model = Livro
fields = '__all__'

Se você fizer um GET:

{
"id": 1,
"titulo": "Python",
"autor": 1
}

 autor mostra o ID do autor


 Você também pode exibir o nome do autor usando nested serializer:

class AutorSerializer([Link]):
class Meta:
model = Autor
fields = '__all__'

class LivroSerializer([Link]):
autor = AutorSerializer() # mostra os dados do autor
class Meta:
model = Livro
fields = '__all__'

Resultado:

{
"id": 1,
"titulo": "Python",
"autor": {
"id": 1,
"nome": "João Silva"
}
}

🔹 Resumo do relacionamento

 ForeignKey cria um relacionamento de um-para-muitos (um autor → muitos livros)


 on_delete define o que acontece quando a tabela “pai” é deletada
 DRF consegue representar isso em JSON automaticamente

Se quiser, posso fazer um diagrama visual mostrando Autor ↔ Livro e como a API
REST se comporta quando deletamos um autor 🔥

Queres que eu faça isso?

mais exmplos por favor

Perfeito! Vamos detalhar mais exemplos de relacionamentos no Django, incluindo


ForeignKey, OneToOneField e ManyToManyField, para ficares totalmente seguro no
conceito. 🔥

1️⃣ ForeignKey – relacionamento um-para-muitos


Cada registro “filho” aponta para um registro pai, mas o pai pode ter vários filhos.
from [Link] import models

class Autor([Link]):
nome = [Link](max_length=100)

class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])
Explicação:

 Um autor pode ter vários livros.


 Cada livro tem apenas um autor.
 on_delete=[Link] → se o autor for deletado, todos os livros desse autor
também serão deletados.

🔹 Exemplo com SET_NULL


class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=models.SET_NULL,
null=True)

 Quando o autor é deletado, o livro continua existindo, mas o campo autor fica NULL.

2️⃣ OneToOneField – relacionamento um-para-um


Cada registro na tabela A se relaciona com exatamente um registro na tabela B.

class Perfil([Link]):
usuario = [Link]('[Link]',
on_delete=[Link])
telefone = [Link](max_length=20)

 Cada usuário tem apenas um perfil.


 Se o usuário for deletado, o perfil também será apagado (CASCADE).

3️⃣ ManyToManyField – relacionamento muitos-para-


muitos
Cada registro pode se relacionar com vários registros de outra tabela.

class Aluno([Link]):
nome = [Link](max_length=100)

class Curso([Link]):
nome = [Link](max_length=100)
alunos = [Link](Aluno)
 Um aluno pode estar em vários cursos.
 Um curso pode ter vários alunos.
 Django cria uma tabela intermediária automaticamente para gerenciar esse
relacionamento.

🔹 Exemplo prático no DRF (nested serializer)


class AutorSerializer([Link]):
class Meta:
model = Autor
fields = '__all__'

class LivroSerializer([Link]):
autor = AutorSerializer() # mostra detalhes do autor
class Meta:
model = Livro
fields = '__all__'

 Resultado JSON:

{
"id": 1,
"titulo": "Python Avançado",
"autor": {
"id": 1,
"nome": "João Silva"
}
}

🔹 Dica prática

 ForeignKey: para listas de filhos (1 → N)


 OneToOneField: para dados exclusivos (1 → 1)
 ManyToManyField: para relacionamentos bidirecionais complexos (N ↔ N)

Se quiser, posso fazer um exemplo completo de biblioteca com:

 Autor
 Livro
 Categoria (ManyToMany)
 API REST funcionando no DRF com GET/POST/PUT/DELETE 🔥

Queres que eu faça isso?

gera um pdf disso

Perfeito! Podemos gerar um PDF com todo esse conteúdo de exemplos e explicações
de Django e DRF. Vou te dar um exemplo de como fazer isso em Python usando a
biblioteca reportlab, que cria PDFs facilmente. 🔥
🔹 Passo 1 – Instalar a biblioteca
pip install reportlab

🔹 Passo 2 – Código Python para gerar o PDF


from [Link] import A4
from [Link] import canvas
from [Link] import cm

# Criar PDF
arquivo = "django_drf_exemplos.pdf"
c = [Link](arquivo, pagesize=A4)
largura, altura = A4

# Configurações iniciais
[Link]("Helvetica-Bold", 16)
[Link](2*cm, altura-2*cm, "Exemplos de Django e DRF")

[Link]("Helvetica", 12)
texto = [
"1. ForeignKey – relacionamento um-para-muitos:",
" class Autor([Link]):",
" nome = [Link](max_length=100)",
" class Livro([Link]):",
" titulo = [Link](max_length=100)",
" autor = [Link](Autor,
on_delete=[Link])",
"",
"2. OneToOneField – relacionamento um-para-um:",
" class Perfil([Link]):",
" usuario = [Link]('[Link]',
on_delete=[Link])",
" telefone = [Link](max_length=20)",
"",
"3. ManyToManyField – relacionamento muitos-para-muitos:",
" class Aluno([Link]):",
" nome = [Link](max_length=100)",
" class Curso([Link]):",
" nome = [Link](max_length=100)",
" alunos = [Link](Aluno)",
"",
"Exemplo DRF - nested serializer:",
" class AutorSerializer([Link]):",
" class Meta:",
" model = Autor",
" fields = '__all__'",
"",
" class LivroSerializer([Link]):",
" autor = AutorSerializer()",
" class Meta:",
" model = Livro",
" fields = '__all__'",
]

# Escrever no PDF
y = altura - 3*cm
for linha in texto:
[Link](2*cm, y, linha)
y -= 0.7*cm
if y < 2*cm: # nova página se necessário
[Link]()
y = altura - 2*cm
[Link]("Helvetica", 12)

# Salvar PDF
[Link]()
print(f"PDF gerado: {arquivo}")

🔹 O que isso faz

 Cria um PDF chamado django_drf_exemplos.pdf


 Contém todos os exemplos de ForeignKey, OneToOne, ManyToMany e DRF
 Quebra de página automática se o texto passar da margem

Se quiser, eu posso gerar uma versão ainda mais completa, incluindo:

 on_delete explicações
 Exemplo JSON
 Estrutura DRF com ViewSet
 Diagrama de relacionamento autor ↔ livro

Isso ficaria pronto para imprimir ou enviar como material de estudo.

Queres que eu faça essa versão completa?

o titulo não esta relacioando

Ah, entendi! 😅
O problema é que no ReportLab, se você só usa drawString, ele não entende
hierarquia de títulos ou títulos grandes – é só texto posicionado na página. Por isso, o
“título” não parece destacado ou relacionado ao conteúdo.

Podemos corrigir isso de duas formas:

1️⃣ Usando estilos com Paragraph do [Link]


(recomendado)
Dá para criar títulos, subtítulos, texto justificado e o conteúdo fica muito mais
organizado.

Exemplo completo:
from [Link] import A4
from [Link] import SimpleDocTemplate, Paragraph, Spacer
from [Link] import getSampleStyleSheet
from [Link] import cm

# Criar PDF
arquivo = "django_drf_exemplos_formatado.pdf"
pdf = SimpleDocTemplate(arquivo, pagesize=A4,
rightMargin=2*cm, leftMargin=2*cm,
topMargin=2*cm, bottomMargin=2*cm)

# Estilos
styles = getSampleStyleSheet()
titulo_style = styles['Title']
subtitulo_style = styles['Heading2']
texto_style = styles['BodyText']

# Conteúdo
conteudo = []

# Título
[Link](Paragraph("Exemplos de Django e DRF", titulo_style))
[Link](Spacer(1, 0.5*cm))

# Seção 1
[Link](Paragraph("1. ForeignKey – relacionamento um-para-
muitos", subtitulo_style))
[Link](Paragraph(
"class Autor([Link]):<br/>"
"&nbsp;&nbsp;nome = [Link](max_length=100)<br/>"
"class Livro([Link]):<br/>"
"&nbsp;&nbsp;titulo = [Link](max_length=100)<br/>"
"&nbsp;&nbsp;autor = [Link](Autor,
on_delete=[Link])", texto_style
))
[Link](Spacer(1, 0.5*cm))

# Seção 2
[Link](Paragraph("2. OneToOneField – relacionamento um-para-
um", subtitulo_style))
[Link](Paragraph(
"class Perfil([Link]):<br/>"
"&nbsp;&nbsp;usuario = [Link]('[Link]',
on_delete=[Link])<br/>"
"&nbsp;&nbsp;telefone = [Link](max_length=20)",
texto_style
))
[Link](Spacer(1, 0.5*cm))

# Seção 3
[Link](Paragraph("3. ManyToManyField – relacionamento muitos-
para-muitos", subtitulo_style))
[Link](Paragraph(
"class Aluno([Link]):<br/>"
"&nbsp;&nbsp;nome = [Link](max_length=100)<br/>"
"class Curso([Link]):<br/>"
"&nbsp;&nbsp;nome = [Link](max_length=100)<br/>"
"&nbsp;&nbsp;alunos = [Link](Aluno)", texto_style
))
[Link](Spacer(1, 0.5*cm))

# DRF Nested Serializer


[Link](Paragraph("Exemplo DRF - nested serializer",
subtitulo_style))
[Link](Paragraph(
"class AutorSerializer([Link]):<br/>"
"&nbsp;&nbsp;class Meta:<br/>"
"&nbsp;&nbsp;&nbsp;&nbsp;model = Autor<br/>"
"&nbsp;&nbsp;&nbsp;&nbsp;fields = '__all__'<br/><br/>"
"class LivroSerializer([Link]):<br/>"
"&nbsp;&nbsp;autor = AutorSerializer()<br/>"
"&nbsp;&nbsp;class Meta:<br/>"
"&nbsp;&nbsp;&nbsp;&nbsp;model = Livro<br/>"
"&nbsp;&nbsp;&nbsp;&nbsp;fields = '__all__'", texto_style
))

# Gerar PDF
[Link](conteudo)
print(f"PDF gerado: {arquivo}")

✅ O que muda com esse método:

 Título principal aparece grande e destacado


 Subtítulos (Heading2) para cada seção
 Texto justificado, legível e com espaçamento
 Quebra de página automática se necessário

Se quiser, eu posso criar uma versão completa do PDF com todos os exemplos que
falámos, incluindo:

 on_delete com CASCADE, SET_NULL, PROTECT


 JSON DRF
 Relacionamento Autor ↔ Livro ↔ Categoria (ManyToMany)
 Tudo formatado profissionalmente para estudo ou impressão

Queres que eu faça essa versão completa?

mais explicação relaciomento

Perfeito! Vamos detalhar como o Django cria relacionamentos entre tabelas de forma
clara, incluindo ForeignKey, OneToOneField e ManyToManyField, e como isso se
reflete na API e banco de dados. 🔥

1️⃣ ForeignKey – Um-para-muitos (1 → N)


Conceito

 Um registro “pai” pode ter vários registros “filhos”.


 Cada registro “filho” aponta para apenas um pai.
 No banco, Django cria uma chave estrangeira (foreign key) na tabela “filho” que
referencia o “pai”.
Exemplo
from [Link] import models

class Autor([Link]):
nome = [Link](max_length=100)

class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])
Como funciona

 Tabela Autor:

id nome

1 João Silva

2 Maria

 Tabela Livro:

id titulo autor_id

1 Python 1

2 Django DRF 1

3 Segurança 2

 autor_id é a foreign key que liga o livro ao autor.


 on_delete=[Link] → Se um autor for deletado, todos os livros desse
autor também serão apagados.

2️⃣ OneToOneField – Um-para-um (1 → 1)


Conceito

 Cada registro em uma tabela se relaciona com exatamente um registro em outra


tabela.

Exemplo
class Usuario([Link]):
nome = [Link](max_length=100)

class Perfil([Link]):
usuario = [Link](Usuario, on_delete=[Link])
telefone = [Link](max_length=20)
 Cada usuário tem apenas um perfil.
 Cada perfil está associado a apenas um usuário.
 Se o usuário for deletado, o perfil também será deletado (CASCADE).

3️⃣ ManyToManyField – Muitos-para-muitos (N ↔ N)


Conceito

 Cada registro pode estar relacionado com vários registros de outra tabela.
 Django cria uma tabela intermediária automaticamente para armazenar os
relacionamentos.

Exemplo
class Aluno([Link]):
nome = [Link](max_length=100)

class Curso([Link]):
nome = [Link](max_length=100)
alunos = [Link](Aluno)

 Um aluno pode estar em vários cursos.


 Um curso pode ter vários alunos.
 Banco de dados cria algo assim:

Tabela Curso_Alunos (intermediária):

id curso_id aluno_id

1 1 1

2 1 2

3 2 1

4️⃣ Como DRF (Django REST Framework) mostra


esses relacionamentos
ForeignKey
class LivroSerializer([Link]):
class Meta:
model = Livro
fields = '__all__'

GET /api/livros/ → JSON:

[
{"id":1, "titulo":"Python", "autor":1},
{"id":2, "titulo":"Django", "autor":1}
]

 autor mostra o ID do autor.

Nested Serializer (mostrar dados do autor)


class AutorSerializer([Link]):
class Meta:
model = Autor
fields = '__all__'

class LivroSerializer([Link]):
autor = AutorSerializer()
class Meta:
model = Livro
fields = '__all__'

GET /api/livros/ → JSON:

[
{
"id":1,
"titulo":"Python",
"autor": {"id":1, "nome":"João Silva"}
}
]

5️⃣ Resumo visual do relacionamento


 ForeignKey: 1 autor → muitos livros
 OneToOneField: 1 usuário → 1 perfil
 ManyToManyField: N alunos ↔ N cursos

Se quiser, posso criar um diagrama completo visual, mostrando Autor ↔ Livro ↔


Categoria (ManyToMany), para veres claramente como o Django faz os
relacionamentos e como o JSON da API reflete isso.

Queres que eu faça esse diagrama?

mais outros

Perfeito! Vamos expandir ainda mais com outros tipos de relacionamentos e cenários
no Django que aparecem muito em projetos reais. 🔥

1️⃣ ForeignKey com PROTECT


class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])

 Impede que um autor seja deletado se tiver livros associados.


 Útil para não perder dados importantes.

Exemplo: tenta deletar “João Silva” → Django retorna erro de integridade.

2️⃣ ForeignKey com SET_DEFAULT


class Categoria([Link]):
nome = [Link](max_length=50, default="Sem Categoria")

class Livro([Link]):
titulo = [Link](max_length=100)
categoria = [Link](Categoria,
on_delete=models.SET_DEFAULT, default=1)

 Quando a categoria original é deletada, o livro recebe uma categoria padrão (ex.:
“Sem Categoria”).

3️⃣ ManyToMany com dados extras na tabela


intermediária
Django permite criar uma tabela intermediária personalizada com campos extras.

class Aluno([Link]):
nome = [Link](max_length=100)

class Curso([Link]):
nome = [Link](max_length=100)
alunos = [Link](Aluno, through='Matricula')

class Matricula([Link]):
aluno = [Link](Aluno, on_delete=[Link])
curso = [Link](Curso, on_delete=[Link])
data_inscricao = [Link](auto_now_add=True)
nota_final = [Link](max_digits=4, decimal_places=2,
null=True)

 Cada aluno pode estar em vários cursos.


 Cada curso pode ter vários alunos.
 A tabela Matricula armazena informações extras, como data de inscrição e nota
final.
4️⃣ OneToOne para perfis avançados
class Usuario([Link]):
username = [Link](max_length=100)

class PerfilAvancado([Link]):
usuario = [Link](Usuario, on_delete=[Link])
endereco = [Link](max_length=200)
telefone = [Link](max_length=20)
data_nascimento = [Link]()

 Ideal para extender o modelo de usuário do Django ([Link]).


 Mantém os dados organizados e separados.

5️⃣ Exemplo complexo DRF com Nested e


ManyToMany
[Link]
class Categoria([Link]):
nome = [Link](max_length=50)

class Livro([Link]):
titulo = [Link](max_length=100)
autor = [Link](Autor, on_delete=[Link])
categorias = [Link](Categoria)
[Link]
class CategoriaSerializer([Link]):
class Meta:
model = Categoria
fields = '__all__'

class LivroSerializer([Link]):
autor = AutorSerializer()
categorias = CategoriaSerializer(many=True)
class Meta:
model = Livro
fields = '__all__'
JSON gerado
{
"id":1,
"titulo":"Python Avançado",
"autor":{"id":1, "nome":"João Silva"},
"categorias":[
{"id":1,"nome":"Programação"},
{"id":2,"nome":"Backend"}
]
}

🔹 Resumo de todos os relacionamentos


Tipo Exemplo Comportamento

ForeignKey Livro → Autor 1 autor → muitos livros

ForeignKey + PROTECT Livro → Autor Impede deletar autor se tiver livros

ForeignKey +
Livro → Autor Livro fica sem autor se ele for deletado
SET_NULL

OneToOneField Perfil → Usuario 1 usuário → 1 perfil

ManyToManyField Curso ↔ Aluno N alunos ↔ N cursos

ManyToMany + Curso ↔ Aluno via Guarda informações extras na tabela


through Matricula intermediária

💡 Dica profissional:
Para APIs REST complexas, Nested Serializers do DRF ajudam a mostrar
relacionamentos detalhados em JSON, e on_delete + through ajudam a controlar
integridade do banco de dados.

Se quiser, posso montar um PDF completo com todos esses exemplos, incluindo
diagramas visuais de relacionamentos, para ficares com um material didático
pronto para estudo ou envio.

Queres que eu faça isso?

agora exmplos de associar ventos a users

Perfeito! Vamos criar exemplos de como associar eventos a usuários no Django, um


caso muito comum em sistemas como agendas, aplicativos de gerenciamento ou
sistemas de notificação. 🔥

Vou detalhar passo a passo:

1️⃣ Model básico de Usuário e Evento


No Django normalmente usamos o modelo de usuário do próprio Django ( [Link])
ou criamos um customizado. Aqui vamos usar o padrão:

from [Link] import models


from [Link] import User # modelo padrão do Django

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
usuario = [Link](User, on_delete=[Link])

def __str__(self):
return f"{[Link]} - {[Link]}"
Explicação:

 Cada Evento pertence a um único Usuário (ForeignKey)


 on_delete=[Link] → se o usuário for deletado, todos os eventos dele
também serão apagados
 Campo data para armazenar a data do evento

2️⃣ Exemplo de criação de eventos no Django shell


from [Link] import User
from [Link] import Evento
from datetime import datetime

# Criar usuário
user1 = [Link].create_user(username="joao", password="1234")

# Criar eventos para o usuário


evento1 = [Link](
titulo="Reunião",
descricao="Reunião com equipe de projeto",
data=datetime(2026, 3, 25, 15, 0),
usuario=user1
)

evento2 = [Link](
titulo="Treinamento",
descricao="Treinamento de DRF",
data=datetime(2026, 3, 26, 10, 0),
usuario=user1
)

3️⃣ Listando eventos de um usuário


user = [Link](username="joao")
eventos = [Link](usuario=user)
for e in eventos:
print([Link], [Link])

Saída:

Reunião 2026-03-25 15:00:00


Treinamento 2026-03-26 10:00:00
4️⃣ Exemplo Many-to-Many: vários usuários por
evento
Às vezes um evento pode ter vários participantes, não só o dono. Para isso usamos
ManyToManyField:

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
participantes = [Link](User,
related_name="eventos_participando")

def __str__(self):
return [Link]
Exemplo de uso:
# Adicionar usuários ao evento
evento = [Link](titulo="Hackathon", descricao="Evento
de programação", data=datetime(2026,3,30,9,0))
user1 = [Link](username="joao")
user2 = [Link].create_user(username="maria", password="1234")

[Link](user1, user2)

# Listar participantes
for u in [Link]():
print([Link])

Saída:

joao
maria

5️⃣ Exemplo de DRF Serializer para Eventos


from rest_framework import serializers
from .models import Evento
from [Link] import User

class UserSerializer([Link]):
class Meta:
model = User
fields = ['id', 'username']

class EventoSerializer([Link]):
participantes = UserSerializer(many=True, read_only=True)

class Meta:
model = Evento
fields = ['id', 'titulo', 'descricao', 'data',
'participantes']

 Retorna JSON assim:


{
"id": 1,
"titulo": "Hackathon",
"descricao": "Evento de programação",
"data": "2026-03-30T09:00:00Z",
"participantes": [
{"id": 1, "username": "joao"},
{"id": 2, "username": "maria"}
]
}

💡 Resumo

 ForeignKey → cada evento pertence a um usuário


 ManyToManyField → evento pode ter vários participantes
 DRF + Serializer → converte usuários e eventos para JSON

Se quiser, posso criar uma versão completa de API de eventos + usuários, pronta
para GET, POST, PUT e DELETE no DRF, incluindo autenticação e filtragem por
usuário, que seria um exemplo profissional de sistema real.

Queres que eu faça isso?

mais exmplo

Perfeito! Vamos a mais exemplos avançados de associar eventos a usuários no


Django, cobrindo cenários comuns em aplicações reais. 🔥

1️⃣ Evento com dono e participantes


Muitas vezes um evento tem um dono (quem criou) e vários participantes:

from [Link] import models


from [Link] import User

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
dono = [Link](User, on_delete=[Link],
related_name="eventos_criados")
participantes = [Link](User,
related_name="eventos_participando")

def __str__(self):
return [Link]

 dono → usuário que criou o evento (1 → N)


 participantes → usuários que participam do evento (N ↔ N)

Exemplo de uso:
from datetime import datetime
user1 = [Link](username="joao")
user2 = [Link].create_user(username="maria", password="1234")

evento = [Link](
titulo="Hackathon",
descricao="Evento de programação",
data=datetime(2026, 4, 1, 9, 0),
dono=user1
)

[Link](user1, user2)

# Listar participantes
for u in [Link]():
print([Link])

Saída:

joao
maria

2️⃣ Evento recorrente


Você pode associar usuários a eventos que se repetem, criando um campo de repetição:

class Evento([Link]):
titulo = [Link](max_length=100)
usuario = [Link](User, on_delete=[Link])
data = [Link]()
recorrencia = [Link](
max_length=10,

choices=[("DIARIO","Diário"),("SEMANAL","Semanal"),("MENSAL","Mensal")
],
default="DIARIO"
)

 Agora cada evento sabe quando se repete


 A API pode filtrar por usuário e por datas futuras usando filter(usuario=user,
data__gte=[Link]())

3️⃣ Evento com status de confirmação por usuário


Cada participante pode ter status diferente (confirmado, pendente, cancelado). Para
isso usamos tabela intermediária personalizada:
class Participacao([Link]):
usuario = [Link](User, on_delete=[Link])
evento = [Link](Evento, on_delete=[Link])
status = [Link](
max_length=10,

choices=[("PENDENTE","Pendente"),("CONFIRMADO","Confirmado"),("CANCELA
DO","Cancelado")],
default="PENDENTE"
)
data_confirmacao = [Link](null=True, blank=True)

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
participantes = [Link](User, through=Participacao)
Exemplo:
participacao = [Link](
usuario=user2,
evento=evento,
status="CONFIRMADO"
)

# Verificar status
p = [Link](usuario=user2, evento=evento)
print([Link])

Saída:

CONFIRMADO

4️⃣ DRF Serializer para eventos com status


from rest_framework import serializers

class ParticipacaoSerializer([Link]):
usuario = [Link]()

class Meta:
model = Participacao
fields = ['usuario', 'status', 'data_confirmacao']

class EventoSerializer([Link]):
participacoes = ParticipacaoSerializer(source='participacao_set',
many=True)

class Meta:
model = Evento
fields = ['id', 'titulo', 'descricao', 'data',
'participacoes']
JSON gerado:
{
"id": 1,
"titulo": "Hackathon",
"descricao": "Evento de programação",
"data": "2026-04-01T09:00:00Z",
"participacoes": [
{"usuario": "joao", "status": "PENDENTE", "data_confirmacao":
null},
{"usuario": "maria", "status": "CONFIRMADO", "data_confirmacao":
"2026-03-24T11:00:00Z"}
]
}

💡 Resumo de cenários de associação eventos ↔ usuários

1. Evento com dono e participantes → dono é FK, participantes é ManyToMany


2. Evento recorrente → campo de repetição + FK do usuário
3. Evento com status por participante → tabela intermediária personalizada (through)
4. DRF pode representar todos os relacionamentos em JSON com Nested Serializer

Se quiser, posso criar uma versão completa de API de eventos, pronta para:

 Criar, listar, atualizar e deletar eventos


 Associar múltiplos usuários
 Mostrar status de cada participante
 Com DRF e autenticação
🔥

Queres que eu faça isso?

agora tipo models existente

Perfeito! 😎 Agora vamos usar modelos existentes do Django e mostrar como associar
eventos a usuários usando [Link] e outros modelos nativos, sem precisar criar
tudo do zero.

Vou te dar exemplos práticos:

1️⃣ Usando User do Django ([Link])


O Django já tem um modelo de usuário pronto:

from [Link] import User


from [Link] import models

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
dono = [Link](User, on_delete=[Link],
related_name="eventos_criados")
participantes = [Link](User,
related_name="eventos_participando")

def __str__(self):
return [Link]

✅ Explicação:

 User já vem com campos como username, email, first_name e last_name


 dono → FK apontando para User (um usuário cria vários eventos)
 participantes → N usuários podem participar de N eventos

2️⃣ Associar eventos a grupos (Group)


O Django também possui modelos de grupo e permissão (Group), que podem ser úteis
para eventos de times ou departamentos:

from [Link] import Group

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
grupos = [Link](Group,
related_name="eventos_grupo")

 Aqui, você associa um evento a vários grupos, e todos os usuários dentro do grupo
podem acessar ou participar do evento.

3️⃣ Exemplo com AbstractUser customizado


Às vezes você quer adicionar campos extras ao usuário existente:

from [Link] import AbstractUser


from [Link] import models

class CustomUser(AbstractUser):
telefone = [Link](max_length=20, blank=True)
departamento = [Link](max_length=50, blank=True)

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
dono = [Link](CustomUser, on_delete=[Link])

 Isso mantém todos os recursos do User, mas adiciona campos extras, e os eventos
podem usar o CustomUser.
4️⃣ Relacionamento com permissões existentes
Você pode controlar quem vê ou pode editar um evento usando permissões do Django:

class Evento([Link]):
titulo = [Link](max_length=100)
descricao = [Link]()
data = [Link]()
dono = [Link](User, on_delete=[Link])

class Meta:
permissions = [
("pode_editar_evento", "Pode editar evento"),
("pode_ver_evento", "Pode ver evento"),
]

 Depois, você pode atribuir permissões aos usuários ou grupos:

user.user_permissions.add([Link](codename="pode_editar
_evento"))

5️⃣ Exemplo DRF com modelos existentes


from rest_framework import serializers
from [Link] import User
from .models import Evento

class UserSerializer([Link]):
class Meta:
model = User
fields = ['id', 'username', 'email']

class EventoSerializer([Link]):
dono = UserSerializer()
participantes = UserSerializer(many=True)

class Meta:
model = Evento
fields = ['id', 'titulo', 'descricao', 'data', 'dono',
'participantes']
JSON resultante:
{
"id": 1,
"titulo": "Hackathon",
"descricao": "Evento de programação",
"data": "2026-04-01T09:00:00Z",
"dono": {"id":1,"username":"joao","email":"joao@[Link]"},
"participantes":[
{"id":1,"username":"joao","email":"joao@[Link]"},
{"id":2,"username":"maria","email":"maria@[Link]"}
]
}

💡 Resumo
 Django já tem User, Group e Permission
 Você pode usar esses modelos diretamente nos eventos
 ForeignKey, ManyToManyField e through funcionam normalmente
 DRF converte automaticamente para JSON

Se quiser, posso criar uma API completa de eventos usando User e Group existentes,
com:

 Criação de eventos
 Associação de participantes e grupos
 Controle de permissões
 GET/POST/PUT/DELETE pronto para DRF

Queres que eu faça isso?


1️⃣ Estrutura de uma loja (app store)
A estrutura do projeto poderia ser:

myproject/

├── [Link]
├── myproject/
│ └── [Link], [Link], [Link] ...
├── store/
│ ├── [Link] # Produtos, Clientes, Pedidos
│ ├── [Link] # Conversão para JSON
│ ├── [Link] # ViewSets
│ ├── [Link] # Rotas da API
│ └── migrations/

2️⃣ Modelos da loja (store/[Link])


from [Link] import models

class Product([Link]):
name = [Link](max_length=100)
price = [Link](max_digits=10, decimal_places=2)
stock = [Link]()

def __str__(self):
return [Link]

class Customer([Link]):
name = [Link](max_length=100)
email = [Link](unique=True)

def __str__(self):
return [Link]

class Order([Link]):
customer = [Link](Customer, on_delete=[Link])
product = [Link](Product, on_delete=[Link])
quantity = [Link]()
created_at = [Link](auto_now_add=True)

3️⃣ Serializers (store/[Link])


from rest_framework import serializers
from .models import Product, Customer, Order

class ProductSerializer([Link]):
class Meta:
model = Product
fields = ['id', 'name', 'price', 'stock']

class CustomerSerializer([Link]):
class Meta:
model = Customer
fields = ['id', 'name', 'email']

class OrderSerializer([Link]):
class Meta:
model = Order
fields = ['id', 'customer', 'product', 'quantity',
'created_at']

4️⃣ ViewSets (store/[Link])


from rest_framework import viewsets
from .models import Product, Customer, Order
from .serializers import ProductSerializer, CustomerSerializer,
OrderSerializer

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer

class CustomerViewSet([Link]):
queryset = [Link]()
serializer_class = CustomerSerializer

class OrderViewSet([Link]):
queryset = [Link]()
serializer_class = OrderSerializer

5️⃣ URLs (store/[Link])


from [Link] import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet, CustomerViewSet, OrderViewSet

router = DefaultRouter()
[Link](r'products', ProductViewSet)
[Link](r'customers', CustomerViewSet)
[Link](r'orders', OrderViewSet)

urlpatterns = [
path('', include([Link])),
]

6️⃣ URLs do projeto (myproject/[Link])


from [Link] import admin
from [Link] import path, include

urlpatterns = [
path('admin/', [Link]),
path('api/', include('[Link]')),
]
7️⃣ Testando a API
Rode o servidor:

python [Link] runserver

Endpoints:

Método URL Descrição

GET /api/products/ Lista produtos

POST /api/products/ Cria produto

GET /api/products/{id}/ Detalhe do produto

PUT/PATCH /api/products/{id}/ Atualiza produto

DELETE /api/products/{id}/ Deleta produto

Mesma lógica para customers e orders.

8️⃣ Funcionalidades básicas da loja


 CRUD de produtos → gerencia estoque e preços
 CRUD de clientes → gerencia cadastro de clientes
 CRUD de pedidos → registra compras dos clientes

💡 Se você quiser, podemos adicionar autenticação, multi-tenant por loja, e calcular


total do pedido para ficar quase uma API real de e-commerce.

Se quiser, posso criar uma versão completa da loja com login, JWT, multi-tenant
(várias lojas) e cálculo de total de pedidos para você ver o sistema profissional.

Quer que eu faça isso?

oque ordem list fais

Ah! Perfeito, você está perguntando sobre o método list() que aparece quando
usamos ViewSets no Django REST Framework. Vou explicar detalhadamente.

1️⃣ O que é list()


Quando você cria um ViewSet, o DRF automaticamente cria ações CRUD para você:

Ação Método HTTP O que faz

list GET Retorna todos os objetos do model

retrieve GET Retorna um objeto específico (por ID)

create POST Cria um novo objeto

update PUT/PATCH Atualiza um objeto

destroy DELETE Deleta um objeto

Então o list() é responsável por retornar todos os registros de uma tabela.

2️⃣ Exemplo de list()


Suponha o ViewSet:

from rest_framework import viewsets


from .models import Product
from .serializers import ProductSerializer

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer

Quando você faz:

GET /api/products/

O DRF chama automaticamente o método list() interno, que faz:

def list(self, request, *args, **kwargs):


queryset = self.get_queryset() # pega todos os produtos
serializer = self.get_serializer(queryset, many=True) # converte
em JSON
return Response([Link]) # retorna a resposta para
o cliente

3️⃣ Personalizando o list()


Você pode sobrescrever o list() para adicionar filtros, ordenação ou outros
cálculos.

Exemplo: mostrar somente produtos com estoque > 0


from rest_framework.response import Response

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer

def list(self, request, *args, **kwargs):


queryset = [Link](stock__gt=0) # estoque
maior que zero
serializer = self.get_serializer(queryset, many=True)
return Response([Link])

Agora, o endpoint /api/products/ só vai retornar produtos disponíveis em estoque.

4️⃣ Resumindo
 list() = retornar todos os objetos do model
 Chamado automaticamente quando você faz GET no endpoint raiz (/products/)
 Você pode sobrescrever para:
o Filtrar resultados
o Ordenar
o Adicionar informações extras no JSON

Se você quiser, posso te mostrar como seria um list() para pedidos de uma loja,
mostrando o total de cada pedido, algo bem real de e-commerce, usando ViewSets +
Serializer.

Quer que eu faça isso?

~~~~~~~~~^^^^^^^^^^ File "C:\Users\Diakuba


Paulo\AppData\Local\Programs\Python\Python313\Lib\site-
packages\rest_framework\[Link]", line 386, in fields for key, value in
self.get_fields().items(): ~~~~~~~~~~~~~~~^^ File "C:\Users\Diakuba
Paulo\AppData\Local\Programs\Python\Python313\Lib\site-
packages\rest_framework\[Link]", line 1081, in get_fields assert hasattr([Link],
'model'), ( ~~~~~~~^^^^^^^^^^^^^^^^^^^^ AssertionError: Class productSerializer missing
"[Link]" attribute

Ah! Esse erro é bem comum quando se cria um serializer no Django REST
Framework.
Ele diz:

AssertionError: Class productSerializer missing "[Link]" attribute

Ou seja: o DRF não encontrou qual model usar dentro do seu serializer.

Vamos resolver passo a passo.


1️⃣ O problema
Você provavelmente tem algo assim no [Link]:

from rest_framework import serializers

class productSerializer([Link]):
class Meta:
fields = ['id', 'name', 'price', 'stock'] # ❌ Faltou o model

O DRF exige que você informe o model que esse serializer representa.

2️⃣ A solução
Adicione o model no Meta:

from rest_framework import serializers


from .models import Product # certifique-se que importou o model
correto

class ProductSerializer([Link]):
class Meta:
model = Product # ✅ Aqui você define o model
fields = ['id', 'name', 'price', 'stock']

Notas importantes:

 class Meta: sempre deve ter model e fields (ou exclude).


 Nomes de classes em Python devem começar com maiúscula (ProductSerializer,
não productSerializer) — evita confusão.

3️⃣ Conferir a importação


Verifique que você está importando o model correto:

from .models import Product

Se tiver algum erro de digitação no nome do model, o DRF não consegue associar.

4️⃣ Resultado esperado


Agora, quando você usar:
serializer = ProductSerializer([Link](), many=True)
print([Link])

Vai funcionar normalmente e gerar JSON como:

[
{
"id": 1,
"name": "Notebook",
"price": "1500.00",
"stock": 10
}
]

Se você quiser, posso te mostrar um template completo de serializer + ViewSet para


a loja, já corrigido e pronto para rodar, sem esse tipo de erro.

Quer que eu faça isso?

agora delete não aparece

Ah! Entendi 😎 — você está usando ViewSet e o endpoint de DELETE não está
aparecendo ou não funciona. Vamos ver os motivos mais comuns e como corrigir.

1️⃣ Confirmação: você está usando ModelViewSet ?


O DELETE só aparece automaticamente se você estiver usando ModelViewSet ou
ReadOnlyModelViewSet não (pois ReadOnly só tem GET).

Exemplo correto ([Link]):

from rest_framework import viewsets


from .models import Product
from .serializers import ProductSerializer

class ProductViewSet([Link]): # ✅ ModelViewSet


queryset = [Link]()
serializer_class = ProductSerializer

Se você estiver usando ReadOnlyModelViewSet ou [Link], o DELETE


não vem por padrão.

2️⃣ Confirme o router ([Link])


Para o DELETE funcionar, você precisa usar um router, que gera todas as URLs
CRUD:
from [Link] import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet

router = DefaultRouter()
[Link](r'products', ProductViewSet)

urlpatterns = [
path('', include([Link])),
]

Endpoints gerados:

Método URL

GET /products/

POST /products/

GET /products/{id}/

PUT/PATCH /products/{id}/

DELETE /products/{id}/

3️⃣ Como usar DELETE


No Postman ou curl:

curl -X DELETE [Link]

Substitua 1 pelo ID do produto que quer deletar.

Se você tentar sem o ID (/products/) → não funciona, porque DELETE só age em


um recurso específico.

4️⃣ Possíveis problemas


1. Usando ReadOnlyModelViewSet → DELETE não existe
2. Endpoint errado → DELETE precisa do ID (/products/1/)
3. Permissões → Se você tiver permissions configuradas (IsAuthenticated ou
IsAdminUser), talvez você não tenha permissão para deletar.

Exemplo de permissão liberada para todos:

from rest_framework import permissions

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer
permission_classes = [[Link]] # libera DELETE para
qualquer usuário

Se você quiser, posso montar um ViewSet completo da loja, com GET, POST, PUT,
PATCH, DELETE, pronto para testar, incluindo permissões básicas.

Quer que eu faça isso?

oque são permissão

Perfeito! Vamos falar de permissões no Django REST Framework (DRF) — isso é


essencial para controlar quem pode fazer o quê na sua API.

1️⃣ O que são permissões


No DRF, permissões determinam quem pode acessar ou alterar dados em cada
endpoint da sua API.

Por exemplo:

Tipo de ação Exemplo

Ler dados Qualquer usuário pode ver produtos (GET)

Criar dados Apenas usuário logado pode criar pedidos (POST)

Atualizar/deletar Apenas administrador pode editar ou deletar produtos

Sem permissões, qualquer um poderia fazer qualquer coisa, inclusive deletar todos
os produtos — perigoso! ⚠️

2️⃣ Como se configuram


No ViewSet, você define uma lista de classes de permissão usando
permission_classes.

Exemplo básico:

from rest_framework import viewsets, permissions


from .models import Product
from .serializers import ProductSerializer

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer
permission_classes = [[Link]] # qualquer um pode
acessar

3️⃣ Tipos comuns de permissões


Permissão O que faz

Qualquer usuário, logado ou não, pode acessar (não


AllowAny
segura)

IsAuthenticated Somente usuários logados podem acessar

Somente usuários administradores (is_staff=True)


IsAdminUser
podem acessar

Qualquer um pode ler (GET), mas só usuários logados


IsAuthenticatedOrReadOnly
podem criar/editar/deletar

Exemplo para loja:

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer
permission_classes = [[Link]]

 GET /products/ → qualquer um pode listar


 POST /products/ → só usuários logados podem criar
 DELETE /products/1/ → só usuários logados podem deletar

4️⃣ Permissões personalizadas


Você também pode criar sua própria permissão, por exemplo, permitir que apenas o
dono do pedido possa deletá-lo:

from rest_framework import permissions

class IsOwner([Link]):
def has_object_permission(self, request, view, obj):
return [Link] == [Link]

Depois, no ViewSet:

class OrderViewSet([Link]):
queryset = [Link]()
serializer_class = OrderSerializer
permission_classes = [IsOwner]
5️⃣ Resumindo
 Permissões = regras de quem pode fazer o quê
 Configuradas no ViewSet com permission_classes
 DRF já vem com permissões prontas (AllowAny, IsAuthenticated, IsAdminUser)
 Pode criar permissões personalizadas se precisar de regras específicas

Se você quiser, posso te mostrar como configurar uma API de loja completa com:

 ViewSets para produtos, clientes e pedidos


 Permissões certas (usuários, admin, do
O que é JWT
 JWT é um token que você envia junto com cada requisição para a API.
 Ele contém informações do usuário, como ID e permissões, de forma segura e
assinada.
 Diferente de sessão, não precisa salvar nada no servidor — o token é auto-contido.

Exemplo de token JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2Nzg5N
jA2MDB9.MF7tL0X8mJYvD_u3M0p5dOZyTz0VjV5h8Zk6lTt8w1A

 Primeira parte → header


 Segunda parte → payload (dados do usuário)
 Terceira parte → assinatura para garantir que não foi alterado

2️⃣ Instalando JWT no Django


O mais usado é o djangorestframework-simplejwt:

pip install djangorestframework-simplejwt

3️⃣ Configurando JWT no Django


No [Link]:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.[Link]',
)
}

Isso diz para o DRF usar JWT para autenticar usuários.

4️⃣ Criando endpoints de login e refresh


No myproject/[Link]:

from [Link] import path


from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)

urlpatterns = [
path('api/token/', TokenObtainPairView.as_view(),
name='token_obtain_pair'), # login
path('api/token/refresh/', TokenRefreshView.as_view(),
name='token_refresh'), # atualizar token
]

 POST /api/token/ → envia { "username": "joao", "password": "123" }


 Retorna:

{
"access": "TOKEN_DE_ACESSO_JWT",
"refresh": "TOKEN_DE_REFRESH"
}

 access → usado para acessar a API


 refresh → usado para gerar um novo token quando o antigo expira

5️⃣ Protegendo endpoints com JWT


No seu ViewSet, basta usar IsAuthenticated:

from rest_framework import viewsets, permissions


from .models import Product
from .serializers import ProductSerializer

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer
permission_classes = [[Link]] # só usuários
logados

Agora, para acessar qualquer endpoint do ProductViewSet, você precisa enviar o


token JWT no header:

Authorization: Bearer SEU_TOKEN_AQUI

6️⃣ Exemplo de fluxo completo


1. Usuário faz login:

POST /api/token/
{
"username": "joao",
"password": "123"
}

2. Recebe tokens:

{
"access": "TOKEN_ACESSO",
"refresh": "TOKEN_REFRESH"
}
3. Acessa a API de produtos:

GET /api/products/
Headers: Authorization: Bearer TOKEN_ACESSO

4. Quando o token expira, usa o refresh:

POST /api/token/refresh/
{
"refresh": "TOKEN_REFRESH"
}

💡 Dica profissional:
Você pode combinar JWT + permissions customizadas para criar uma loja multi-
tenant segura, onde cada usuário só vê seus pedidos ou produtos de sua loja.
Imagine uma empresa que fornece uma plataforma única para academias, lojas de
suplementos e escolas de yoga. Cada cliente da plataforma é um tenant diferente, e
cada tenant tem seus próprios dados, usuários e permissões.

1️⃣ Tenants (Empresas clientes)


Tenant ID Nome da Empresa Tipo

1 StrongFit Gym Academia

2 BodyPower Nutrition Loja de suplementos

3 ZenYoga Studio Escola de Yoga

2️⃣ Usuários por tenant


Usuário Tenant Função

joao@[Link] StrongFit Gym Instrutor

maria@[Link] StrongFit Gym Gerente

carlos@[Link] BodyPower Nutrition Administrador

ana@[Link] BodyPower Nutrition Vendedora

lucas@[Link] ZenYoga Studio Instrutor

Cada usuário só consegue acessar os dados do seu próprio tenant.

3️⃣ Modelos do Django (simplificado)


from [Link] import models
from [Link] import AbstractUser

class Tenant([Link]):
name = [Link](max_length=150)
company_type = [Link](max_length=50) # Academia, Loja,
Yoga, etc.

class User(AbstractUser):
tenant = [Link](Tenant, on_delete=[Link],
null=True)

class Product([Link]):
tenant = [Link](Tenant, on_delete=[Link])
name = [Link](max_length=100)
price = [Link](max_digits=10, decimal_places=2)
stock = [Link]()

class ClassSchedule([Link]):
tenant = [Link](Tenant, on_delete=[Link])
class_name = [Link](max_length=100)
instructor = [Link](User, on_delete=[Link])
start_time = [Link]()
end_time = [Link]()

class Order([Link]):
tenant = [Link](Tenant, on_delete=[Link])
customer = [Link](User, on_delete=[Link])
product = [Link](Product, on_delete=[Link])
quantity = [Link]()
created_at = [Link](auto_now_add=True)

4️⃣ Serializers
from rest_framework import serializers
from .models import Product, ClassSchedule, Order, User

class ProductSerializer([Link]):
class Meta:
model = Product
fields = ['id', 'name', 'price', 'stock']

class ClassScheduleSerializer([Link]):
class Meta:
model = ClassSchedule
fields = ['id', 'class_name', 'instructor', 'start_time',
'end_time']

class OrderSerializer([Link]):
class Meta:
model = Order
fields = ['id', 'customer', 'product', 'quantity',
'created_at']

class UserSerializer([Link]):
class Meta:
model = User
fields = ['id', 'username', 'tenant']

5️⃣ ViewSets com filtro multi-tenant


from rest_framework import viewsets, permissions
from .models import Product, ClassSchedule, Order
from .serializers import ProductSerializer, ClassScheduleSerializer,
OrderSerializer

class ProductViewSet([Link]):
serializer_class = ProductSerializer
permission_classes = [[Link]]
def get_queryset(self):
return [Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

class ClassScheduleViewSet([Link]):
serializer_class = ClassScheduleSerializer
permission_classes = [[Link]]

def get_queryset(self):
return
[Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

class OrderViewSet([Link]):
serializer_class = OrderSerializer
permission_classes = [[Link]]

def get_queryset(self):
return [Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link],
customer=[Link])

✅ Cada usuário só acessa os dados do seu tenant.


✅ Produtos, pedidos e aulas estão isolados por tenant.

6️⃣ JWT para autenticação


 Usuário faz login → recebe token JWT
 Todas as requisições enviam o token no header Authorization: Bearer <token>
 ViewSets usam [Link] para filtrar os dados

Exemplo de endpoints:

Endpoint Método Ação

/api/token/ POST Login e gerar JWT

/api/token/refresh/ POST Atualizar JWT expirado

/api/products/ GET Listar produtos do tenant

/api/orders/ POST Criar pedido no tenant

/api/class-schedules/ POST Criar aula no tenant


7️⃣ Cenário real de uso
1. João (StrongFit Gym) loga → recebe JWT
2. Ele cria uma aula de spinning → automaticamente ligada ao tenant StrongFit Gym
3. Maria (BodyPower Nutrition) loga → só vê produtos e pedidos da loja de suplementos
dela
4. Admin da ZenYoga Studio → gerencia aulas e instrutores sem ver dados das outras
academias

Tudo isso usando um único código e banco de dados, isolando os tenants logicamente.

8️⃣ Benefícios para a empresa


 Uma única plataforma atende várias empresas (multi-tenant).
 Isolamento de dados garante segurança.
 JWT mantém autenticação segura e stateless.
 CRUD completo para produtos, pedidos, aulas e usuários.
 Fácil de escalar e manter.

Se você quiser, posso montar um diagrama visual super completo, mostrando:

 Usuários
 Tenants
 JWT
 Produtos, pedidos, aulas
 Fluxo de requisições

Isso ajuda a entender toda a arquitetura do multi-tenant de forma prática.

Quer que eu faça isso?

agora um exmplo de gestão softwere decgestão

Perfeito! Vamos criar um exemplo completo de software de gestão empresarial


(ERP) usando multi-tenant, JWT e Django REST Framework. Vou detalhar de forma
longa e clara, mostrando como uma empresa pode gerenciar clientes, funcionários,
produtos e pedidos em um sistema multi-tenant.

Exemplo: Sistema de Gestão Empresarial (ERP Multi-Tenant)


Imagine uma empresa que oferece um software de gestão (ERP) para pequenas e
médias empresas. Cada cliente da plataforma é um tenant, e cada tenant tem seus
próprios usuários, produtos, pedidos e relatórios.
1️⃣ Tenants (Empresas clientes)
Tenant ID Nome da Empresa Tipo

1 Alpha Comércio Comércio

2 Beta Serviços Prestação de serviços

3 Gama Indústria Indústria

Cada tenant funciona como uma empresa isolada, sem acesso aos dados de outro
tenant.

2️⃣ Usuários por tenant


Usuário Tenant Função

joao@[Link] Alpha Administrador

maria@[Link] Alpha Vendedora

carlos@[Link] Beta Gerente

ana@[Link] Beta Funcionária

lucas@[Link] Gama Supervisor

Cada usuário só consegue acessar os dados do seu tenant.

3️⃣ Modelos Django (simplificado)


from [Link] import models
from [Link] import AbstractUser

class Tenant([Link]):
name = [Link](max_length=150)
company_type = [Link](max_length=50)

class User(AbstractUser):
tenant = [Link](Tenant, on_delete=[Link],
null=True)

class Product([Link]):
tenant = [Link](Tenant, on_delete=[Link])
name = [Link](max_length=100)
price = [Link](max_digits=10, decimal_places=2)
stock = [Link]()

class Customer([Link]):
tenant = [Link](Tenant, on_delete=[Link])
name = [Link](max_length=100)
email = [Link]()
phone = [Link](max_length=20)

class Order([Link]):
tenant = [Link](Tenant, on_delete=[Link])
customer = [Link](Customer, on_delete=[Link])
product = [Link](Product, on_delete=[Link])
quantity = [Link]()
created_at = [Link](auto_now_add=True)

 Cada Produto, Cliente e Pedido pertence a um tenant.


 Cada usuário tem tenant_id para filtrar os dados.

4️⃣ Serializers
from rest_framework import serializers
from .models import Product, Customer, Order, User

class ProductSerializer([Link]):
class Meta:
model = Product
fields = ['id', 'name', 'price', 'stock']

class CustomerSerializer([Link]):
class Meta:
model = Customer
fields = ['id', 'name', 'email', 'phone']

class OrderSerializer([Link]):
class Meta:
model = Order
fields = ['id', 'customer', 'product', 'quantity',
'created_at']

class UserSerializer([Link]):
class Meta:
model = User
fields = ['id', 'username', 'tenant']

5️⃣ ViewSets com Multi-Tenant


from rest_framework import viewsets, permissions
from .models import Product, Customer, Order
from .serializers import ProductSerializer, CustomerSerializer,
OrderSerializer

class ProductViewSet([Link]):
serializer_class = ProductSerializer
permission_classes = [[Link]]

def get_queryset(self):
return [Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

class CustomerViewSet([Link]):
serializer_class = CustomerSerializer
permission_classes = [[Link]]

def get_queryset(self):
return
[Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

class OrderViewSet([Link]):
serializer_class = OrderSerializer
permission_classes = [[Link]]

def get_queryset(self):
return [Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

Cada usuário só vê os produtos, clientes e pedidos do seu tenant.

6️⃣ JWT para autenticação


 Usuário faz login → recebe token JWT.
 Todas as requisições enviam token no header Authorization: Bearer <token>.
 ViewSets usam [Link] para filtrar os dados.

Exemplo de endpoints:

Endpoint Método Ação

/api/token/ POST Login e gerar JWT

/api/token/refresh/ POST Atualizar token

/api/products/ GET Listar produtos do tenant

/api/customers/ GET Listar clientes do tenant

/api/orders/ GET Listar pedidos do tenant


7️⃣ Fluxo de uso real
1. João (tenant Alpha) faz login → recebe JWT
2. João cria um produto e adiciona estoque → produto vinculado ao tenant Alpha
3. João registra um cliente → vinculado ao tenant Alpha
4. João cria um pedido → vinculado ao tenant Alpha e ao cliente
5. Maria (tenant Beta) faz login → só vê produtos, clientes e pedidos do tenant Beta

Tudo isso usando uma única aplicação, mas mantendo os dados isolados por tenant.

8️⃣ Benefícios para a empresa


 Um software único atende várias empresas (multi-tenant).
 Segurança: dados de cada empresa isolados.
 Escalabilidade: fácil adicionar mais clientes.
 Controle por tenant: permissões, relatórios e CRUD separados.
 JWT garante autenticação segura e stateless.
 Pode incluir relatórios, faturamento e dashboards específicos para cada tenant.

Se você quiser, posso criar um diagrama completo do ERP multi-tenant, mostrando


tenants, usuários, produtos, pedidos e JWT, para visualizar todo o fluxo de dados do
sistema.

Quer que eu faça isso?

um sistema escolar

Perfeito! Vamos criar um exemplo detalhado de sistema escolar multi-tenant,


mostrando como funcionaria em Python com Django REST Framework + JWT +
ViewSets. Vou explicar de forma clara, passo a passo, e com casos reais.

Exemplo: Sistema Escolar Multi-Tenant


Imagine uma plataforma que atende várias escolas usando uma única aplicação.

 Cada escola é um tenant.


 Cada usuário pertence a uma escola específica.
 O sistema deve garantir que uma escola não veja os dados de outra.

1️⃣ Tenants (Escolas)


Tenant ID Nome da Escola Cidade

1 Escola Alpha Luanda

2 Escola Beta Benguela

3 Escola Gama Huambo

2️⃣ Usuários por tenant


Usuário Tenant Função

joao@[Link] Escola Alpha Diretor

maria@[Link] Escola Alpha Professor

carlos@[Link] Escola Beta Diretor

ana@[Link] Escola Beta Secretária

lucas@[Link] Escola Gama Coordenador

Cada usuário só consegue acessar os dados da sua escola.

3️⃣ Modelos Django (simplificado)


from [Link] import models
from [Link] import AbstractUser

class Tenant([Link]):
name = [Link](max_length=150)
city = [Link](max_length=100)

class User(AbstractUser):
tenant = [Link](Tenant, on_delete=[Link],
null=True)

class Student([Link]):
tenant = [Link](Tenant, on_delete=[Link])
name = [Link](max_length=100)
grade = [Link](max_length=20)
date_of_birth = [Link]()

class Teacher([Link]):
tenant = [Link](Tenant, on_delete=[Link])
name = [Link](max_length=100)
subject = [Link](max_length=50)

class Class([Link]):
tenant = [Link](Tenant, on_delete=[Link])
name = [Link](max_length=50)
teacher = [Link](Teacher, on_delete=[Link])
students = [Link](Student)

 Cada Student, Teacher e Class pertence a um tenant (uma escola).


 O campo tenant é usado para filtrar dados.

4️⃣ Serializers
from rest_framework import serializers
from .models import Student, Teacher, Class, User

class StudentSerializer([Link]):
class Meta:
model = Student
fields = ['id', 'name', 'grade', 'date_of_birth']

class TeacherSerializer([Link]):
class Meta:
model = Teacher
fields = ['id', 'name', 'subject']

class ClassSerializer([Link]):
students = StudentSerializer(many=True, read_only=True)
class Meta:
model = Class
fields = ['id', 'name', 'teacher', 'students']

class UserSerializer([Link]):
class Meta:
model = User
fields = ['id', 'username', 'tenant']

5️⃣ ViewSets com Multi-Tenant


from rest_framework import viewsets, permissions
from .models import Student, Teacher, Class
from .serializers import StudentSerializer, TeacherSerializer,
ClassSerializer

class StudentViewSet([Link]):
serializer_class = StudentSerializer
permission_classes = [[Link]]

def get_queryset(self):
return [Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

class TeacherViewSet([Link]):
serializer_class = TeacherSerializer
permission_classes = [[Link]]
def get_queryset(self):
return [Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

class ClassViewSet([Link]):
serializer_class = ClassSerializer
permission_classes = [[Link]]

def get_queryset(self):
return [Link](tenant=[Link])

def perform_create(self, serializer):


[Link](tenant=[Link])

Cada usuário só acessa os dados da sua escola.

6️⃣ JWT para autenticação


 Cada usuário faz login → recebe token JWT.
 Todas as requisições enviam token no header:

Authorization: Bearer <seu_token>

 O ViewSet usa [Link] para filtrar os dados automaticamente.

7️⃣ Cenário real de uso


1. João (diretor da Escola Alpha) loga → recebe JWT
2. João cria um professor → vinculado ao tenant Escola Alpha
3. João cadastra alunos → todos ligados à Escola Alpha
4. João cria turmas → vincula alunos e professores, tudo dentro do tenant dele
5. Carlos (diretor da Escola Beta) loga → só vê alunos, professores e turmas da Escola
Beta

Mesmo com várias escolas usando o mesmo sistema, cada tenant é isolado.

8️⃣ Benefícios
 Uma plataforma única atende várias escolas (multi-tenant).
 Segurança: dados de cada escola são isolados.
 Escalabilidade: fácil adicionar novas escolas.
 Flexibilidade: diferentes regras por tenant (ex.: quantidade máxima de alunos por
turma).
 JWT garante autenticação segura e stateless.
O que é JWT
 JWT é um token que você envia junto com cada requisição para a API.
 Ele contém informações do usuário, como ID e permissões, de forma segura e
assinada.
 Diferente de sessão, não precisa salvar nada no servidor — o token é auto-contido.

Exemplo de token JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2Nzg5N
jA2MDB9.MF7tL0X8mJYvD_u3M0p5dOZyTz0VjV5h8Zk6lTt8w1A

 Primeira parte → header


 Segunda parte → payload (dados do usuário)
 Terceira parte → assinatura para garantir que não foi alterado

2️⃣ Instalando JWT no Django


O mais usado é o djangorestframework-simplejwt:

pip install djangorestframework-simplejwt

3️⃣ Configurando JWT no Django


No [Link]:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.[Link]',
)
}

Isso diz para o DRF usar JWT para autenticar usuários.

4️⃣ Criando endpoints de login e refresh


No myproject/[Link]:

from [Link] import path


from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)

urlpatterns = [
path('api/token/', TokenObtainPairView.as_view(),
name='token_obtain_pair'), # login
path('api/token/refresh/', TokenRefreshView.as_view(),
name='token_refresh'), # atualizar token
]

 POST /api/token/ → envia { "username": "joao", "password": "123" }


 Retorna:

{
"access": "TOKEN_DE_ACESSO_JWT",
"refresh": "TOKEN_DE_REFRESH"
}

 access → usado para acessar a API


 refresh → usado para gerar um novo token quando o antigo expira

5️⃣ Protegendo endpoints com JWT


No seu ViewSet, basta usar IsAuthenticated:

from rest_framework import viewsets, permissions


from .models import Product
from .serializers import ProductSerializer

class ProductViewSet([Link]):
queryset = [Link]()
serializer_class = ProductSerializer
permission_classes = [[Link]] # só usuários
logados

Agora, para acessar qualquer endpoint do ProductViewSet, você precisa enviar o


token JWT no header:

Authorization: Bearer SEU_TOKEN_AQUI

6️⃣ Exemplo de fluxo completo


1. Usuário faz login:

POST /api/token/
{
"username": "joao",
"password": "123"
}

2. Recebe tokens:

{
"access": "TOKEN_ACESSO",
"refresh": "TOKEN_REFRESH"
}
3. Acessa a API de produtos:

GET /api/products/
Headers: Authorization: Bearer TOKEN_ACESSO

4. Quando o token expira, usa o refresh:

POST /api/token/refresh/
{
"refresh": "TOKEN_REFRESH"
}

💡 Dica profissional:
Você pode combinar JWT + permissions customizadas para criar uma loja multi-
tenant segura, onde cada usuário só vê seus pedidos ou produtos de sua loja.

Se você quiser, posso criar uma API completa de loja usando ViewSets + JWT +
permissions, já pronta para testar no Postman, com login, registro e CRUD protegido.

Quer que eu faça isso?

agora mult tenent

Perfeito! Agora vamos juntar tudo: uma API de loja com multi-tenant usando Django
REST Framework + JWT + ViewSets. Vou explicar do zero, passo a passo, para você
entender como funciona e implementar.

1️⃣ O que é Multi-Tenant


Multi-tenant significa que uma mesma aplicação atende a vários “tenants” (ou
clientes/lojas) isoladamente, sem que um usuário veja os dados do outro.

Exemplo:

Tenant Usuário Produtos visíveis

Loja A João Produtos da Loja A

Loja B Maria Produtos da Loja B

Cada usuário só vê o que pertence ao seu tenant.


2️⃣ Estrutura do modelo com Tenant
Vamos adicionar um campo tenant_id nos modelos relevantes:

from [Link] import models


from [Link] import User

class Tenant([Link]):
name = [Link](max_length=100)

class Product([Link]):
tenant = [Link](Tenant, on_delete=[Link])
name = [Link](max_length=100)
price = [Link](max_digits=10, decimal_places=2)
stock = [Link]()

class Order([Link]):
tenant = [Link](Tenant, on_delete=[Link])
customer = [Link](User, on_delete=[Link])
product = [Link](Product, on_delete=[Link])
quantity = [Link]()

 Cada produto pertence a um tenant.


 Cada pedido também pertence a um tenant.

3️⃣ Serializers
from rest_framework import serializers
from .models import Product, Order

class ProductSerializer([Link]):
class Meta:
model = Product
fields = ['id', 'name', 'price', 'stock']

class OrderSerializer([Link]):
class Meta:
model = Order
fields = ['id', 'customer', 'product', 'quantity']

4️⃣ Filtrando dados por Tenant no ViewSet


O segredo do multi-tenant é filtrar o queryset pelo tenant do usuário logado:

from rest_framework import viewsets, permissions


from .models import Product, Order
from .serializers import ProductSerializer, OrderSerializer

class ProductViewSet([Link]):
serializer_class = ProductSerializer
permission_classes = [[Link]]
def get_queryset(self):
user_tenant = [Link].tenant_id # supondo que cada
User tem tenant_id
return [Link](tenant_id=user_tenant)

class OrderViewSet([Link]):
serializer_class = OrderSerializer
permission_classes = [[Link]]

def get_queryset(self):
user_tenant = [Link].tenant_id
return [Link](tenant_id=user_tenant)

✅ Agora cada usuário só vê os produtos e pedidos do seu tenant.

5️⃣ Atribuindo tenant ao criar


No create(), você também precisa atribuir automaticamente o tenant:

class ProductViewSet([Link]):
serializer_class = ProductSerializer
permission_classes = [[Link]]

def get_queryset(self):
return
[Link](tenant_id=[Link].tenant_id)

def perform_create(self, serializer):


[Link](tenant_id=[Link].tenant_id)

Mesma lógica para pedidos (OrderViewSet).

6️⃣ Login JWT + Multi-Tenant


1. Cada usuário tem um campo tenant_id.
2. Quando faz login e recebe o JWT, o tenant fica embutido no usuário.
3. Todos os endpoints filtram pelo tenant_id do usuário logado.

Isso garante isolamento total entre tenants.

7️⃣ Resumo do fluxo multi-tenant


1. Usuário loga via JWT → recebe token
2. ViewSet → filtra dados usando tenant_id do usuário
3. Criar objetos → perform_create() adiciona o tenant automaticamente
4. GET/PUT/DELETE → só afeta objetos do tenant do usuário
💡 Dica profissional:

Você pode combinar isso com:

 Permissions personalizadas → só o dono do tenant pode criar produtos


 Admin multi-tenant → para gerenciar todas as lojas
 Filtros avançados → buscar produtos do seu tenant por categoria, estoque etc.

Se você quiser, posso montar uma API completa de loja multi-tenant com JWT,
ViewSets, produtos, pedidos e usuários, pronta para testar no Postman.

Você também pode gostar