Gostaria de alterar um nome de campos específicos em um modelo:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
deve mudar para:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Qual é a maneira mais fácil de fazer isso usando o Sul?
python
django
django-models
django-south
Jonathan
fonte
fonte
Respostas:
Você pode usar a
db.rename_column
funçãoO primeiro argumento de
db.rename_column
é o nome da tabela, por isso é importante lembrar como o Django cria nomes de tabelas :No caso de você ter um nome de modelo com várias palavras e com camelo, como ProjectItem, o nome da tabela será
app_projectitem
(ou seja, um sublinhado não será inserido entreproject
eitem
mesmo que seja com camelo).fonte
Aqui está o que eu faço:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
Nota
renaming_column_x
pode ser o que você quiser, é apenas uma maneira de atribuir um nome descritivo ao arquivo de migração.Isso irá gerar um arquivo chamado
myapp/migrations/000x_renaming_column_x.py
que excluirá sua coluna antiga e adicionará uma nova coluna.Modifique o código neste arquivo para alterar o comportamento da migração para uma renomeação simples:
fonte
x
oucolumn_x
?--auto
migração primeiro é uma ótima dica. Evita problemas com o South ORM Freezer, que ocorrem se a migração tiver apenas métodosforwards
ebackwards
métodos, mas não contiver omodel
objeto congelado .db.rename_column
não renomeia as restrições associadas à coluna. A migração ainda funcionará, mas você terá restrições com o nome do nome da coluna antiga. Eu tinha uma coluna com uma restrição de exclusividade, renomeei-a usando esse método, testei que a restrição de exclusividade ainda existia e recebi um erro, mas o nome da restrição em si ainda estava usando o nome da coluna antiga. Talvez um explícitodb.delete_unique
edb.create_unique
teria feito isso, mas eu decidi ir com a solução de sjh.Eu não sabia sobre a coluna db.rename, parece útil, no entanto, no passado, adicionei a nova coluna como uma migração de esquema e criei uma migração de dados para mover valores para o novo campo, depois uma segunda migração de esquema para remover a coluna antiga
fonte
db.rename_column
não renomeia as restrições para você, então você precisa lidar com isso manualmente. Se você esquecer de fazê-lo, a migração funcionará, exceto que, sem o seu conhecimento, pode haver uma restrição ainda usando o nome da coluna antiga. Não está claro para mim se o problema é apenas cosmético ou se, em uma migração futura em que a restrição deve ser manipulada ou descartada para o sul, não será possível encontrá-la. De qualquer forma, fazê-lo aqui como sjh sugere é a maneira segura de fazê-lo: você pode deixar o Sul descobrir o que deve ser descoberto.O Django 1.7 introduziu Migrações , agora você nem precisa instalar um pacote extra para gerenciar suas migrações.
Para renomear seu modelo, você precisa criar uma migração vazia primeiro:
Então você precisa editar o código da sua migração assim:
E depois disso, você precisa executar:
fonte
Apenas mude o modelo e execute
makemigrations
em 1.9O Django detecta automaticamente que você excluiu e criou um único campo e pergunta:
Diga sim e a migração correta é criada. Magia.
fonte
south
aos aplicativos instalados no arquivo de configuração do projeto.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Se você estiver usando 'pycharm', poderá usar 'ctrl + shift + r' em vez de 'manage.py' e 'shift' para parâmetros.
fonte