from django.db import modelsclass Lunch(models.Model):    left_side = models.CharField(max_length=100, null=True)    center = models.CharField(max_length=100, null=True)    right_side = models.CharField(max_length=100, null=True)

Cada campo é uma coluna e cada linha é uma instância de objeto Django desse modelo.

Aqui está uma representação de uma tabela de banco de dados para o modelo Django “Lunch” acima. No banco de dados, seu nome seria lunch_table.

Eu irialado esquerdoCentrolado direito
1GarfoPratoColher

O modelo Lunch tem três campos: left_side, center, e right-side. Uma instância de um Lunch objeto teria “Fork” para o left_side, um “prato” para o center, e “colher” para o right_side.

Django adiciona automaticamente um id campo se você não especificar uma chave primária.

Se você quisesse mudar o nome do seu modelo Lunch, você faria isso em seu models.py código.

Por exemplo, altere “Almoço” para “Jantar” e depois corre python manage.py makemigrations. Você vai ver:

python manage.py makemigrationsDid you rename the backend.Lunch model to Dinner? [y/N] yMigrations for 'backend':  backend/migrations/0003_auto_20200922_2331.py    - Rename model Lunch to Dinner

Django gera automaticamente os arquivos de migração apropriados. A linha relevante do arquivo de migração gerado neste caso seria assim:

migrations.RenameModel(old_name="Lunch", new_name="Dinner"),

Essa operação mudaria o nome de nosso modelo “Almoço” para “Jantar”, mantendo todo o resto igual.

Mas e se você também quisesse alterar a estrutura da própria tabela do banco de dados, seu esquema, bem como garantir que os dados existentes terminassem no lugar certo em sua mesa de jantar?

cover 2
Desenho horrível do autor.

Vamos explorar como transformar nosso modelo Lunch em um modelo Dinner que se parece com isto:

from django.db import modelsclass Dinner(models.Model):    top_left = models.CharField(max_length=100, null=True)    top_center = models.CharField(max_length=100, null=True)    top_right = models.CharField(max_length=100, null=True)    bottom_left = models.CharField(max_length=100, null=True)    bottom_center = models.CharField(max_length=100, null=True)    bottom_right = models.CharField(max_length=100, null=True)

… Com uma tabela de banco de dados parecida com esta:

Eu iriatopo_esquerdotop_centercanto superior direitoinferior esquerdobottom_centercanto inferior direito
1Prato de pãoColherVidroGarfoPratoFaca

Como manipular dados com migrações Django

Antes de começar a manipular seus dados, é sempre uma boa ideia criar um backup de seu banco de dados que você possa restaurar caso algo dê errado.

Existem várias maneiras de fazer isso, dependendo do banco de dados que você está usando. Normalmente, você pode encontrar instruções procurando por <your database name> e palavras-chave como backup, recovery, ou snapshot.

Para projetar sua migração, é útil se familiarizar com os operações de migração.

As migrações são executadas passo a passo e cada operação é uma forma de adicionar, remover ou alterar dados. Como um quebra-cabeça estratégico, é importante fazer alterações no modelo uma etapa de cada vez para que as migrações geradas tenham o resultado correto.

Já renomeamos nosso modelo com sucesso. Agora, vamos renomear os campos que contêm os dados que queremos reter:

class Dinner(models.Model):    bottom_left = models.CharField(max_length=100, null=True)    bottom_center = models.CharField(max_length=100, null=True)    top_center = models.CharField(max_length=100, null=True)

O Django às vezes é inteligente o suficiente para determinar os nomes dos campos antigos e novos corretamente. Você será solicitado a confirmar:

python manage.py makemigrationsDid you rename dinner.center to dinner.bottom_center (a CharField)? [y/N] yDid you rename dinner.left_side to dinner.bottom_left (a CharField)? [y/N] yDid you rename dinner.right_side to dinner.top_center (a CharField)? [y/N] yMigrations for 'backend':  backend/migrations/0004_auto_20200914_2345.py    - Rename field center on dinner to bottom_center    - Rename field left_side on dinner to bottom_left    - Rename field right_side on dinner to top_center

Em alguns casos, você vai querer tentar renomear o campo e executar makemigrations um por vez.

Agora que os campos existentes foram migrados para seus novos nomes, adicione os campos restantes ao modelo:

class Dinner(models.Model):    top_left = models.CharField(max_length=100, null=True)    top_center = models.CharField(max_length=100, null=True)    top_right = models.CharField(max_length=100, null=True)    bottom_left = models.CharField(max_length=100, null=True)    bottom_center = models.CharField(max_length=100, null=True)    bottom_right = models.CharField(max_length=100, null=True)

Corrida makemigrations novamente agora nos dá:

python manage.py makemigrationsMigrations for 'backend':  backend/migrations/0005_auto_20200914_2351.py    - Add field bottom_right to dinner    - Add field top_left to dinner    - Add field top_right to dinner

Você Terminou! Ao gerar migrações do Django, você configurou com sucesso seu dinner_table e moveu os dados existentes para seu novo local.

Complexidade adicional

Você notará que nossos modelos de Almoço e Jantar não são muito complexos. De muitos Django’s opções de campo de modelo, estamos apenas usando CharField. Nós também definimos null=True para deixar o Django armazenar valores vazios como NULL no banco de dados.

As migrações do Django podem lidar com complexidade adicional, como alterar os tipos de campo e se um valor em branco ou nulo é permitido. Eu guardo Django’s referência de campo do modelo útil porque trabalho com diversos tipos de dados e diferentes casos de uso.

Migrações desmistificadas

Espero que este artigo tenha ajudado você a entender melhor as migrações do Django e como elas funcionam!

Agora que você pode alterar os modelos e manipular os dados existentes em seu aplicativo Django, certifique-se de usar seus poderes com sabedoria.

Faça backup de seu banco de dados, pesquise e planeje suas migrações e sempre execute testes antes de trabalhar com dados de clientes. Ao fazer isso, você tem o potencial de permitir que seu aplicativo cresça – com níveis gerenciáveis ​​de complexidade.