Saltar para o conteúdo
Django REST Framework: CRUD Completo em 30 Minutos
Python

Django REST Framework: CRUD Completo em 30 Minutos

20 de maio de 2026·Paulo Pereira

Setup do Projeto

pip install django djangorestframework
django-admin startproject meusite
cd meusite
python manage.py startapp api

settings.py:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'api',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20,
}

Model

# api/models.py
from django.db import models

class Produto(models.Model):
    nome        = models.CharField(max_length=200)
    descricao   = models.TextField(blank=True)
    preco       = models.DecimalField(max_digits=10, decimal_places=2)
    estoque     = models.PositiveIntegerField(default=0)
    criado_em   = models.DateTimeField(auto_now_add=True)
    atualizado_em = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.nome

Serializer

# api/serializers.py
from rest_framework import serializers
from .models import Produto

class ProdutoSerializer(serializers.ModelSerializer):
    class Meta:
        model  = Produto
        fields = '__all__'
        read_only_fields = ['criado_em', 'atualizado_em']

    def validate_preco(self, value):
        if value <= 0:
            raise serializers.ValidationError("Preço deve ser positivo.")
        return value

ViewSet

# api/views.py
from rest_framework import viewsets, filters, permissions
from django_filters.rest_framework import DjangoFilterBackend
from .models import Produto
from .serializers import ProdutoSerializer

class ProdutoViewSet(viewsets.ModelViewSet):
    queryset         = Produto.objects.all().order_by('-criado_em')
    serializer_class = ProdutoSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    filter_backends  = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['estoque']
    search_fields    = ['nome', 'descricao']
    ordering_fields  = ['preco', 'criado_em']

URLs

# api/urls.py
from rest_framework.routers import DefaultRouter
from .views import ProdutoViewSet

router = DefaultRouter()
router.register(r'produtos', ProdutoViewSet)

urlpatterns = router.urls

Isso gera automaticamente:

  • GET /produtos/ — listar
  • POST /produtos/ — criar
  • GET /produtos/{id}/ — detalhe
  • PUT/PATCH /produtos/{id}/ — atualizar
  • DELETE /produtos/{id}/ — remover

Autenticação por Token

# urls.py raiz
from rest_framework.authtoken.views import obtain_auth_token

urlpatterns = [
    path('api/', include('api.urls')),
    path('api/token/', obtain_auth_token),
]
curl -X POST http://localhost:8000/api/token/ \
  -d "username=admin&password=senha"
# {"token": "abc123..."}

curl http://localhost:8000/api/produtos/ \
  -H "Authorization: Token abc123..."

Actions Customizadas

from rest_framework.decorators import action
from rest_framework.response import Response

class ProdutoViewSet(viewsets.ModelViewSet):
    ...
    @action(detail=False, methods=['get'])
    def sem_estoque(self, request):
        produtos = self.get_queryset().filter(estoque=0)
        serializer = self.get_serializer(produtos, many=True)
        return Response(serializer.data)

Conclusão

DRF é uma das ferramentas mais produtivas do ecossistema Python. Com poucos arquivos, você tem uma API completa com validação, paginação, autenticação e filtragem. A curva de aprendizado compensa muito no médio prazo.