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 apisettings.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.nomeSerializer
# 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 valueViewSet
# 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.urlsIsso gera automaticamente:
GET /produtos/— listarPOST /produtos/— criarGET /produtos/{id}/— detalhePUT/PATCH /produtos/{id}/— atualizarDELETE /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.