django-perf-review
Ajuda seu agente a revisar o código Django para encontrar problemas de performance. É útil para otimizar o banco de dados e o ORM, encontrando consultas lentas.
O que ela faz
Esta ferramenta analisa seu código Django para encontrar problemas de desempenho que afetam a velocidade do seu site. Ela foca em problemas comprovados relacionados a como você acessa o banco de dados.
Quando usar
- ✓Quando seu site Django está lento.
- ✓Se você suspeita que o banco de dados está sobrecarregado.
- ✓Para verificar se há erros comuns de performance no código.
Exemplo do que pedir para a IA
“Revise o desempenho do meu código Django e procure por problemas de N+1 queries.”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
A ferramenta examina seu código em busca de padrões conhecidos que causam lentidão, como buscar dados repetidamente. Ela só relata problemas que consegue provar que existem.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill django-perf-reviewOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/django-perf-review/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Revisão de Performance do Django
Revise o código Django para problemas de performance validados. Pesquise a base de código para confirmar os problemas antes de reportá-los. Reporte apenas o que você pode provar.
Quando Usar
- Você precisa de uma revisão de performance do Django focada em problemas de ORM e consultas verificados.
- O código provavelmente tem consultas N+1, querysets ilimitados, índices ausentes ou outros gargalos impulsionados pelo banco de dados.
- Você quer apenas descobertas de performance comprováveis, não conselhos de otimização especulativos.
Abordagem da Revisão
- Pesquise primeiro - Rastreie o fluxo de dados, verifique otimizações existentes, valide o volume de dados
- Valide antes de reportar - Correspondência de padrões não é validação
- Zero descobertas é aceitável - Não fabrique problemas para parecer completo
- A severidade deve corresponder ao impacto - Se você se pegar escrevendo "menor" em uma descoberta CRÍTICA, não é crítica. Rebaixe ou pule.
Categorias de Impacto
Os problemas são organizados por impacto. Concentre-se em CRÍTICO e ALTO - estes causam problemas reais em escala.
| Prioridade | Categoria | Impacto |
|---|---|---|
| 1 | Consultas N+1 | CRÍTICO - Multiplica com os dados, causa timeouts |
| 2 | Querysets Ilimitados | CRÍTICO - Esgotamento de memória, mortes por OOM |
| 3 | Índices Ausentes | ALTO - Varreduras completas de tabelas grandes |
| 4 | Loops de Escrita | ALTO - Contenção de bloqueio, requisições lentas |
| 5 | Padrões Ineficientes | BAIXO - Raramente vale a pena reportar |
Prioridade 1: Consultas N+1 (CRÍTICO)
Impacto: Cada N+1 adiciona O(n) idas e vindas ao banco de dados. 100 linhas = 100 consultas extras. 10.000 linhas = timeout.
Regra: Pré-carregue dados relacionados acessados em loops
Valide rastreando: View → Queryset → Template/Serializer → Acesso ao loop
# PROBLEM: N+1 - each iteration queries profile
def user_list(request):
users = User.objects.all()
return render(request, 'users.html', {'users': users})
# Template:
# {% for user in users %}
# {{ user.profile.bio }} ← triggers query per user
# {% endfor %}
# SOLUTION: Prefetch in view
def user_list(request):
users = User.objects.select_related('profile')
return render(request, 'users.html', {'users': users})
Regra: Pré-carregue em serializers, não apenas em views
Serializers DRF que acessam campos relacionados causam N+1 se o queryset não for otimizado.
# PROBLEM: SerializerMethodField queries per object
class UserSerializer(serializers.ModelSerializer):
order_count = serializers.SerializerMethodField()
def get_order_count(self, obj):
return obj.orders.count() # ← query per user
# SOLUTION: Annotate in viewset, access in serializer
class UserViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return User.objects.annotate(order_count=Count('orders'))
class UserSerializer(serializers.ModelSerializer):
order_count = serializers.IntegerField(read_only=True)
Regra: Propriedades de modelo que consultam são perigosas em loops
# PROBLEM: Property triggers query when accessed
class User(models.Model):
@property
def recent_orders(self):
return self.orders.filter(created__gte=last_week)[:5]
# Used in template loop = N+1
# SOLUTION: Use Prefetch with custom queryset, or annotate
Checklist de Validação para N+1
- Rastreou o fluxo de dados da view para o template/serializer
- Confirmou que o campo relacionado é acessado dentro de um loop
- Pesquisou na base de código por
select_related/prefetch_relatedexistentes - Verificou se a tabela tem um número significativo de linhas (1000+)
- Confirmou que este é um caminho crítico (não admin, não ação rara)
Prioridade 2: Querysets Ilimitados (CRÍTICO)
Impacto: Carregar tabelas inteiras esgota a memória. Tabelas grandes causam mortes por OOM e reinícios de workers.
Regra: Sempre págine endpoints de lista
# PROBLEM: No pagination - loads all rows
class UserListView(ListView):
model = User
template_name = 'users.html'
# SOLUTION: Add pagination
class UserListView(ListView):
model = User
template_name = 'users.html'
paginate_by = 25
Regra: Use iterator() para processamento em lote grande
# PROBLEM: Loads all objects into memory at once
for user in User.objects.all():
process(user)
# SOLUTION: Stream with iterator()
for user in User.objects.iterator(chunk_size=1000):
process(user)
Regra: Nunca chame list() em querysets ilimitados
# PROBLEM: Forces full evaluation into memory
all_users = list(User.objects.all())
# SOLUTION: Keep as queryset, slice if needed
users = User.objects.all()[:100]
…
Perguntas frequentes
O que são 'N+1 queries'?
É quando o código faz uma consulta inicial para obter uma lista de itens e, em seguida, faz uma consulta separada para cada item dessa lista, o que pode deixar o site muito lento.
O que são 'unbounded querysets'?
São consultas que tentam carregar todos os dados de uma tabela de uma vez, o que pode consumir muita memória e travar o sistema se a tabela for grande.
A ferramenta sugere como corrigir os problemas?
Não diretamente. Ela identifica e relata os problemas comprovados para que você possa corrigi-los.
Detalhes
Descrição original do autor
Django performance code review. Use when asked to "review Django performance", "find N+1 queries", "optimize Django", "check queryset performance", "database performance", "Django ORM issues", or audit Django code for performance problems.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #2855
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
cpp-testing
Faz seu agente escrever e melhorar testes para código C++. Ajuda a configurar ferramentas de teste e a corrigir erros.
affaan-m/ECC
csharp-testing
Ajuda seu agente a criar testes para código C# e .NET. Ele usa as melhores práticas para garantir que os testes sejam eficientes e confiáveis.
affaan-m/ECC
django-tdd
Faz seu agente aplicar estratégias de teste para Django com pytest-django e TDD. É útil para escrever testes robustos e garantir a qualidade do código, especialmente para APIs DRF.
affaan-m/ECC