Skip to main content

Command Palette

Search for a command to run...

Como fazer seeding no Django e popular seu banco de dados com Signals

Updated
3 min read
Como fazer seeding no Django e popular seu banco de dados com Signals

Em projetos Django, frequentemente nos deparamos com a necessidade de pré-popular nosso banco de dados com informações pré-definidas. É aqui que entram os "seeds" - uma técnica para inserir dados iniciais de forma automatizada. Vamos explorar como implementar seeds no Django usando um exemplo prático e utilizando os signals.

O problema

Imagine que você está desenvolvendo uma aplicação que precisa de categorias predefinidas. Criar essas categorias manualmente toda vez que você configura um novo ambiente pode ser tedioso e propenso a erros.

A solução

Django nos oferece uma maneira elegante de resolver isso usando signals, especificamente o signail post_migrate. Este signal é disparado após todas as migrações serem aplicadas, tornando-o o momento perfeito para inserir nossos dados iniciais.

Veja como podemos implementar um seed para uma tabela categorias e como é simples:

# meu_app/signals.py
from django.db.models.signals import post_migrate
from django.dispatch import receiver
from django.apps import apps

@receiver(post_migrate)
def create_default_categories(sender, **kwargs):
    Categoria = apps.get_model('meu_app', 'Category')
    categories = [
        {"nome": "Tecnologia", "descricao": "Artigos e notícias sobre tecnologia."},
        {"nome": "Esportes", "descricao": "Novidades do mundo dos esportes."},
        {"nome": "Culinária", "descricao": "Receitas e dicas de culinária."},
        {"nome": "Viagens", "descricao": "Destinos e dicas para viajantes."},
    ]
    for cat_data in categories:
        category, created = Category.objects.get_or_create(
            name=cat_data["nome"],
            defaults={"description": cat_data.get("descricao", "")}
        )
        if created:
            print(f"Categoria '{category.name}' criada.")
        else:
            print(f"Categoria '{category.name}' já existe.")
    print("Criação de categorias padrão concluída.")

Este código define uma função que será executada após as migrações, ou seja, após o comando migrate. Dentro dela, definimos uma lista de categorias que queremos criar.

Não esquece de garantir que o Django saiba sobre nosso arquivo signals.py. A maneira recomendade de registrar signals é no método ready() da configuração do seu aplicativo AppConfig.

# meu_app/apps.py
from django.apps import AppConfig

class MeuAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'meu_app'

    def ready(self):
        # Importar os sinais aqui para que sejam registrados quando o app estiver pronto
        import meu_app.signals

Benefícios:

  1. Consistência: Garante que todos os ambientes (desenvolvimento, teste, produção) tenham os mesmos dados iniciais.

  2. Automação: Elimina a necessidade de inserção manual de dados.

  3. Versionamento: As seeds podem ser versionadas junto com o código, facilitando o rastreamento de mudanças.

Melhores práticas:

  1. Use get_or_create() para evitar duplicatas.

  2. Mantenha suas seeds em um arquivo separado para melhor organização.

  3. Considere usar fixtures para dados mais complexos.

Conclusão

Implementar seeds no Django é uma prática poderosa que pode economizar tempo e garantir consistência em seus projetos. Ao automatizar a criação de dados iniciais, você simplifica o processo de configuração e manutenção de sua aplicação Django. Existe outras formas de fazer seeds no Django, se você conhece comenta aqui em baixo quais são e não esquece de ir ler o meu post sobre o poder de uma boa documentação em Python para melhorar as suas aplicações no Django.