Confirme primeiro contando queries, usando o Django Debug Toolbar localmente ou assertNumQueries num teste. O padrão é um loop tocando um objeto relacionado, o que dispara uma query por linha porque querysets são preguiçosos. Corrija relações diretas com select_related, que faz um join, e relações reversas ou muitos para muitos com prefetch_related, que roda uma query extra.
Por que os entrevistadores perguntam isso
Esse é o bug de performance mais comum em aplicações apoiadas em ORM, então chega a ser requisito da vaga. Os entrevistadores querem ver que você mede antes de otimizar, que você entende a preguiça do queryset como causa raiz, e que você sabe que select_related e prefetch_related resolvem formatos diferentes de relação. Acrescentar um teste de regressão em vez de só remendar é o sinal sênior.
Como estruturar sua resposta
- Diga que você mede a contagem de queries primeiro.
- Explique a preguiça como causa raiz.
- Case select_related e prefetch_related com os tipos de relação.
- Trave a correção com um teste de contagem de queries.
Exemplo de resposta
Medir vem primeiro, porque chutar performance de ORM é desperdiçar uma tarde. Localmente eu ligo o debug toolbar ou logo as queries em nível debug, e se já está em produção eu olho o trace, onde um endpoint disparando quatrocentos selects quase idênticos é inconfundível. A causa é que um queryset não bate no banco até você iterar, e acessar uma chave estrangeira em cada linha busca aquela relação preguiçosamente. Para uma chave estrangeira direta eu adiciono select_related, que vira um join e uma query só. Para relações reversas ou muitos para muitos eu uso prefetch_related, que dispara uma segunda query e costura os resultados em Python. Depois de corrigir, eu escrevo um teste embrulhando a view em assertNumQueries com o número esperado, porque senão a próxima pessoa adiciona um campo no template e aquilo regride em silêncio. Num dashboard interno a gente levou uma página de cerca de trezentas queries para quatro, e o tempo de carga foi de uns dois segundos para menos de duzentos milissegundos.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Quando prefetch_related é mais lento que um join?
- O que only e defer mudam aqui?
- Como você pegaria isso em code review?
Mais perguntas para Desenvolvedor Python
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas