Pular para o conteúdo
Skillpedia
Testes48 mil · #2855

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

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/django-perf-review/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/django-perf-review/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
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-review

Ou 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.md
Conteú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

  1. Pesquise primeiro - Rastreie o fluxo de dados, verifique otimizações existentes, valide o volume de dados
  2. Valide antes de reportar - Correspondência de padrões não é validação
  3. Zero descobertas é aceitável - Não fabrique problemas para parecer completo
  4. 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_related existentes
  • 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.

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#2855
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas