Como usar as migrações do django para adicionar um campo slug único em um modelo já populado

Olá galera!

Esses dias eu tive que adicionar um campo “slug” único para um modelo em meu banco de dados que já possuía dados.

É de conhecimento de todo desenvolvedor Django que quando rodamos as migrações nesse tipo de situação o django pede para definirmos um valor default para atribuir às linhas existentes daquele modelo na tabela.

Segue o passo-a-passo:

Adicionar o novo campo no modelo

Crie os arquivos da migração

Quando ele te pedir um valor default, insira qualquer valor.. Ex.: ‘meu-slug-field’

O Django vai gerar um arquivo dentro da pasta “migrations” com um código similar a seguir:

Vamos agora fazer algumas alterações nesse camarada aí…

A primeira coisa a fazer é mudar o valor default. Vamos utilizar a biblioteca “uuid” que será a responsável por gerar strings dinâmicas para nós:

Na operação responsável por adicionar nosso novo campo vamos definir como valor default a chamada para o método uuid.uuid4, alterar o parâmetro “preserve_default” para “True” além de remover o parâmetro “unique”.

A operação acima irá adicionar nosso campo slug, mas ele ainda não tem a propriedade “unique” e ainda não populamos as linhas da tabela já existentes com o valor do novo campo.

Vamos então criar um método responsável por varrer todos os objetos existentes do nosso modelo, gerar uma string randômica para cada um e salvar no banco.

E logo abaixo da operação que adiciona o novo campo vamos mandar o Django executar nosso gerador de uuids.

Pronto! Agora só temos que informar ao Django que nosso campo “slug” deve ser único em nossa tabela. Vamos criar um “AlterField” e adicionar o parâmetro unique=True

Ao final, nosso código deve estar mais ou menos assim:

Agora é só rodar o “migrate” e tudo deve funcionar! 😉

Valeu galera e até a próxima! =)

Sê o primeiro

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *