Django: Resumo Completo

O Django tem muitas peças em movimento. Este post é uma referência para os padrões que você usa repetidamente: models, views, templates, o ORM, migrations, o painel admin e o DRF.

TL;DR: Uma referência Django cobrindo models, consultas ORM, views, URLs, templates, migrations, admin e o básico do Django REST Framework.
Stack: Python, Django, Django REST Framework
Nível: Iniciante
Tempo de leitura: ~15 min

Instalar Django, criar projeto e app

pip install django
django-admin startproject meuprojeto .
python manage.py startapp meuapp

Configurar conexão com banco

# Instalar driver para PostgreSQL (Ubuntu)
sudo apt-get install libpq-dev
pip install psycopg2-binary

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'admin',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

# Rodar migrations
python3 manage.py makemigrations
python3 manage.py migrate
python manage.py createsuperuser

Django REST Framework

pip install djangorestframework

# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
]

View (APIView)

from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView

class AddInstrumentView(APIView):
    def post(self, request):
        name = request.data.get('name')
        if name is None:
            return Response({"message": "nome é obrigatório"}, status=status.HTTP_400_BAD_REQUEST)

        use_case_request = AddInstrumentRequest(name=name)
        use_case = AddInstrument()
        use_case_response = use_case.execute(use_case_request)
        return Response({"name": use_case_response.name}, status=status.HTTP_200_OK)

Casos de uso e protocolos

from app.models import Instrument

class AddInstrument:
    def execute(self, request):
        instrument = Instrument.objects.create(name=request.name)
        return instrument

class AddInstrumentRequest:
    def __init__(self, name: str):
        self.name = name

class AddInstrumentResponse:
    def __init__(self, name: str):
        self.name = name

Rotas

# project/urls.py
urlpatterns = [
    path("admin/", admin.site.urls),
    path('api/', include('presentation.urls')),
]

# presentation/urls.py
urlpatterns = [
    path('add-instrument', AddInstrumentView.as_view()),
    path('list-instruments', ListInstrumentView.as_view()),
]

Autenticação JWT

pip install djangorestframework-simplejwt

# settings.py
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
}

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(days=1),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
    "ROTATE_REFRESH_TOKENS": True,
    "BLACKLIST_AFTER_ROTATION": True,
    "AUTH_HEADER_TYPES": ("Bearer",),
}

O que você construiu

Uma referência completa de Django cobrindo o framework desde os models até padrões prontos para produção. Volte aqui quando precisar de um padrão Django específico rapidamente.

Próximos passos

  • Use select_related() para relacionamentos ForeignKey e OneToOne para evitar queries N+1, e prefetch_related() para ManyToMany e ForeignKey reverso.
  • Use signals do Django (post_save, pre_delete) para efeitos colaterais que devem acontecer após operações de model, mantendo views e lógica de negócio limpos.
  • Habilite o Django Debug Toolbar em desenvolvimento para ver todas as queries SQL por requisição. A maioria dos problemas de performance no Django é relacionada ao banco.

Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.

Deixe um comentário