# 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:

```python
# 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`.

```python
# 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](https://blog.ricardotenv.dev/o-poder-de-uma-boa-documentacao-em-python) para melhorar as suas aplicações no Django.
