Você usa o ORM de foma errada (e eu posso provar)

Você usa o ORM de foma errada (e eu posso provar)

Quando comecei a desenvolver com Django, eu acreditava que se tudo estava funcionando então estava tudo certo.

Mas conforme meu projeto cresceu, comecei a perceber algumas páginas ficando mais lentas.

O problema não era o Django.

Eu estava fazendo consultas desnecessárias no banco sem perceber.

Antes de entender o ORM, precisamos entender o que é uma query

De forma simples, uma query é uma solicitação feita ao banco de dados.

Toda vez que sua aplicação precisa:

  • buscar dados
  • criar registros
  • atualizar informações
  • deletar algo

uma query é executada.

O problema

Imagine os seguintes modelos:

class Category(models.Model):
    name = models.CharField(max_length=100)


class Task(models.Model):
    title = models.CharField(max_length=255)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

Agora imagine esse código:

tasks = Task.objects.all()

for task in tasks:
    print(task.category.name)

Parece normal.

Mas aqui acontece algo importante:

  • o Django busca todas as tasks
  • depois busca a categoria de cada task separadamente

Ou seja:
quanto mais tasks existirem, mais consultas serão feitas.

A solução

O Django já possui uma forma simples de resolver isso:

tasks = Task.objects.select_related("category")

for task in tasks:
    print(task.category.name)

Agora o Django busca tudo junto.

Resultado:

  • menos consultas
  • menos processamento
  • aplicação mais rápida

O mais interessante sobre otimização no Django é que, muitas vezes, não precisamos mudar toda a estrutura do projeto para melhorar a performance da aplicação.

Pequenas alterações já podem reduzir bastante a quantidade de consultas feitas no banco de dados.

E isso é apenas uma pequena demonstração do que o ORM do Django é capaz de fazer quando realmente entendemos como ele funciona.

Além de facilitar o desenvolvimento, ele também oferece recursos extremamente poderosos para criar aplicações mais eficientes, organizadas e escaláveis.