thiagocosta.py

Programming, Management etc


  • django , python , admin , sql

Melhorando a performance do admin do Django

Recentemente me deparei com um grande problema. Descobri que o admin do Django estava fazendo muitas queries, sobrecarregando demais o servidor.

Não estou falando de 10, 20 queries, mas 474 queries. Sim, mais de 400 queries em uma única página. Veja o print abaixo:

474 queries em 416.93 ms

Mas como descobri isso? Existe um plugin muito legal chamado Django Debug Toolbar (imagem acima) que te dá algumas informações importantes sobre sua página, uma delas é o número de queries executadas.

O que acontece é que, por padrão, o Django admin faz uma query para pegar todos os objetos e pra cada objeto faz outra query para pegar o objeto relacionado ao invés de selecionar tudo através de JOINs, usando assim uma única query.

Para consultas que irão retornar poucos objetos, o comportamento padrão não é um grande problema, mas se as suas consultas retornam muitos objetos, isso irá te trazer muitos problemas.

Encontrar a solução pra esse problema foi fácil. O Django Admin tem uma opção chamada "listselectedrelated" que desabilita esse comportamento padrão; basta usá-la na sua subclasse do ModelAdmin. Exemplo:

:::python
# models.py
class User(models.Model):
    comments = models.ForeignKey('Comment')

# admin.py
class UserAdmin(ModelAdmin):
    list_select_related = ('comments', )

Veja o que o Django Debug Toolbar mostrou após a alteração:

4 queries em 114.21 ms

Diferença grande, não? :)

Considero o Django Debug Toolbar uma ferramenta praticamente obrigatória para desenvolvimento web com Django. Use-a para inspecionar outras partes do seu site e não apenas o admin.

Thiago Costa

Desenvolvedor apaixonado orientado à melhoria contínua (kaizen), agente de mudanças e praticante de métodos ágeis, morando no Rio de Janeiro.

comments powered by Disqus