Se você começou o projeto com o template antigo, este material é para você.
Na versão antiga do template, o projeto usava Passage para autenticação e o modelo User possuía o campo passage_id.
O template novo mudou essa base:
SimpleJWT;User não usa mais passage_id;Isso significa que você não deve copiar o projeto antigo inteiro por cima do novo.
O caminho correto é outro: criar um projeto novo a partir do template atual e trazer para ele apenas aquilo que você já construiu no domínio da livraria.
IMPORTANTE: Esta migração deve ser tratada como uma reconstrução guiada do projeto, e não como uma cópia integral do repositório antigo.
Em resumo, você vai:
Autor, Categoria, Editora e Livro;app/urls.py do projeto novo.core/admin.py;app/urls.py;core/models/__init__.py;core/serializers/__init__.py;core/views/__init__.py;SPECTACULAR_SETTINGS, se necessário.core/authentication.py;core/models/user.py antigo;core/serializers/user.py antigo;core/views/user.py antigo;passage_id;PASSAGE_APP_ID e PASSAGE_API_KEY;pyproject.toml antigo;requirements.txt antigo;db.sqlite3 antigo;dump.json antigo.Antes de começar, você precisa ter:
Crie um repositório novo usando o template atual em https://github.com/marrcandre/template_django_pdm e depois clone o projeto normalmente.
Para essa preparação inicial, você também pode se apoiar na aula 2.2 Criação de uma aplicação, principalmente na parte em que o tutorial mostra a estrutura da aplicação core e como validar migrations, banco e admin.
Em seguida, instale as dependências:
pdm install
Crie o arquivo .env:
cp .env.exemplo .env
Suba o servidor:
pdm run dev
Agora valide o projeto novo antes de copiar qualquer código do projeto antigo.
Abra o Swagger em /api/doc e verifique se estes endpoints existem:
/api/token//api/token/refresh//api/token/verify//api/registro//api/usuarios/me/IMPORTANTE: Neste momento, não substitua
db.sqlite3, não use odump.jsonantigo e não copie as migrations do projeto anterior.
Agora você vai abrir o projeto antigo e localizar apenas os arquivos que pertencem ao domínio da livraria.
Faça isso arquivo por arquivo, sem copiar pastas inteiras.
No caso da turma, isso normalmente inclui:
core/models/autor.pycore/models/categoria.pycore/models/editora.pycore/models/livro.pycore/serializers/autor.pycore/serializers/categoria.pycore/serializers/editora.pycore/serializers/livro.pycore/views/autor.pycore/views/categoria.pycore/views/editora.pycore/views/livro.pyCopie esses arquivos para o projeto novo, preservando os nomes e a organização das pastas.
User antigo;Depois de copiar os arquivos, abra cada um deles no projeto novo e confira se os imports ainda fazem sentido.
Se algum arquivo importar algo que não existe no template novo, corrija isso antes de seguir.
Depois de copiar os arquivos do domínio, você precisa reconectar esse código à estrutura do projeto novo.
Esta etapa exige edição manual. Não substitua esses arquivos por inteiro.
core/models/__init__.pyAbra o arquivo do projeto novo e acrescente apenas os imports dos models que você trouxe.
Exemplo do que deve passar a existir:
from .autor import Autor
from .categoria import Categoria
from .editora import Editora
from .livro import Livro
from .user import User
core/serializers/__init__.pyPreserve os serializers de usuário do template novo e acrescente os serializers do domínio.
Exemplo:
from .autor import AutorSerializer
from .categoria import CategoriaSerializer
from .editora import EditoraSerializer
from .livro import LivroSerializer
from .user import UserRegistrationSerializer, UserSerializer
core/views/__init__.pyPreserve as views de usuário do template novo e acrescente os viewsets do domínio.
Exemplo:
from .autor import AutorViewSet
from .categoria import CategoriaViewSet
from .editora import EditoraViewSet
from .livro import LivroViewSet
from .user import UserRegistrationView, UserViewSet
core/admin.pyMantenha o UserAdmin do template novo.
Depois, registre os models do domínio que você trouxe.
Se o seu admin.py antigo tinha registros de Autor, Categoria, Editora e Livro, reintroduza apenas esses registros.
Mantendo o registro do User do template novo, adicione ao final do arquivo linhas como estas:
admin.site.register(models.Autor)
admin.site.register(models.Categoria)
admin.site.register(models.Editora)
admin.site.register(models.Livro)
IMPORTANTE: Não recoloque
passage_idnoUserAdmin.
app/urls.pyAqui você precisa ter cuidado para não apagar a autenticação nova do template.
O arquivo app/urls.py do projeto novo já vem com a parte de autenticação e documentação pronta. Essa estrutura deve ser mantida.
Você deve preservar:
/api/token/;/api/token/refresh/;/api/token/verify/;/api/registro/;/api/usuarios/.Depois disso, faça apenas duas alterações.
Antes de registrar esses routers, você precisa importar os viewsets no bloco de imports vindo de core.views.
No template novo, esse import vem enxuto, trazendo apenas as views de usuário. Substitua esse trecho por um bloco como este:
from core.views import (
AutorViewSet,
CategoriaViewSet,
EditoraViewSet,
LivroViewSet,
UserRegistrationView,
UserViewSet,
)
Esse bloco deve ficar na mesma região do arquivo onde o template novo já importa UserRegistrationView e UserViewSet.
Depois dos imports, vá até a parte do arquivo onde aparece:
router = DefaultRouter()
Logo abaixo dessa linha, adicione os registros das suas entidades. Exemplo:
router.register(r'autores', AutorViewSet, basename='autores')
router.register(r'categorias', CategoriaViewSet, basename='categorias')
router.register(r'editoras', EditoraViewSet, basename='editoras')
router.register(r'livros', LivroViewSet, basename='livros')
Essas linhas devem ficar antes de urlpatterns.
Se você preferir, pense no app/urls.py assim:
core.views para incluir seus viewsets;Antes de gerar migrations, confira se:
__init__.py estão corretos;app/urls.py;core/admin.py não voltou a depender de passage_id.Agora faça uma revisão final para garantir que os resíduos do template antigo não foram trazidos para o projeto novo.
Além disso, observe a barra inferior do VS Code e confira se o editor mostra que não há problemas no projeto, isto é, 0 erros e 0 avisos.
core/authentication.pycore/models/user.py antigocore/serializers/user.py antigocore/views/user.py antigopassage_idPASSAGE_APP_ID e PASSAGE_API_KEYpassage-identitydb.sqlite3 antigodump.json antigocore/models/user.pycore/serializers/user.pycore/views/user.pyapp/settings.pyapp/urls.pyDepois que os arquivos do domínio estiverem no lugar e os arquivos estruturais estiverem adaptados, gere as migrations no projeto novo.
pdm run migrate
Como o script migrate do projeto já executa makemigrations antes, ele deve criar apenas as migrations novas referentes ao domínio que você trouxe.
User antigo;passage_id;Depois de rodar as migrations:
core.png e verifique se as entidades foram criadas corretamente. Se quiser, compare com a imagem do projeto antigo;db.sqlite3 e confira se as tabelas foram criadas corretamente.Com a migração concluída, valide o funcionamento geral do projeto.
/api/token/ funcionando;/api/usuarios/me/ funcionando;Autor funcionando;Categoria funcionando;Editora funcionando;Livro funcionando;core inteiraEsse é o erro mais comum e mais perigoso.
Quando você faz isso, normalmente leva junto:
User antigo;passage_id;app/urls.py por inteiroAo fazer isso, você pode perder os endpoints do JWT e do registro de usuário.
app/settings.py por inteiroAo fazer isso, você corre o risco de remover a configuração atual de autenticação e voltar a depender de variáveis do Passage.
__init__.pyNesse caso, os arquivos existem, mas o projeto não consegue enxergá-los corretamente.
O objetivo desta aula é migrar a estrutura do código do domínio para um projeto novo.
Ela não foi pensada para reaproveitar o banco legado do template antigo.
Agora você tem novamente o projeto da livraria com as entidades e APIs que já havia construído, mas usando a autenticação nova baseada em SimpleJWT.
Com isso, o backend fica alinhado com o template atual do curso e pronto para integração com o frontend.
Agora você já pode criar também um projeto frontend a partir do template Vue em https://github.com/marrcandre/template-vue3. A conexão da API ao frontend com Vue 3 é apresentada na aula 5 do tutorial em https://github.com/marrcandre/django-drf-tutorial?tab=readme-ov-file#5-conectando-a-api-ao-frontend-com-vue-3, e esse template deve se conectar corretamente ao backend que você acabou de migrar.