Eu sei que a partir do Django 1.7 não preciso usar o South ou qualquer outro sistema de migração, então estou apenas usando um comando simples python manage.py makemigrations
No entanto, tudo que recebo é este erro:
You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).
Aqui está models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
Quais são as opções?
Respostas:
Você precisa fornecer um valor padrão:
fonte
default = website
não faz o trabalhonew_field
comowebsite
.Se você está no início do ciclo de desenvolvimento e não se importa com os dados do banco de dados atual, basta removê-los e migrar. Mas primeiro você precisa limpar o diretório de migrações e remover suas linhas da tabela (django_migrations)
fonte
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
__init__.py
das migrações ou restaurá-lo depois, caso contrário, o makemigrations não funcionará stackoverflow.com/a/46362750/1649917python manage.py sqlmigrate name_of_your_app nb_of_the_migration
também é obrigatórioUma opção é declarar um valor padrão para 'new_field':
outra opção é declarar 'new_field' como um campo anulável:
Se você decidir aceitar 'new_field' como um campo anulável, você pode querer aceitar 'nenhuma entrada' como entrada válida para 'new_field'. Em seguida, você também deve adicionar a
blank=True
declaração:Mesmo com
null=True
e / oublank=True
você pode adicionar um valor padrão, se necessário:fonte
Se você está no início do ciclo de desenvolvimento, pode tentar isso -
Remova / comente esse modelo e todos os seus usos. Aplique migrações. Isso excluiria esse modelo e, em seguida, adicionaria o modelo novamente, executaria as migrações e você teria um modelo limpo com o novo campo adicionado.
fonte
Se "site" pode estar vazio
new_field
, então também deve ser definido como vazio.Agora, se você deseja adicionar lógica ao salvar onde se
new_field
está vazio para obter o valor do "site", tudo o que você precisa fazer é substituir a função de salvamento por vocêModel
assim:fonte
Caso alguém esteja definindo um
ForeignKey
, você pode apenas permitir campos anuláveis sem definir um padrão:Se você já tem dados armazenados no banco de dados, também pode definir um valor padrão:
fonte
Você não pode adicionar referência à tabela que já contém dados.
Mudança:
para:
Faz:
mudar de novo:
faça a migração novamente:
fonte
Em new_file, adicione a propriedade booleana null.
depois de executar um
./manage.py syncdb
para atualizar o banco de dados. e finalmente você corre./manage.py makemigrations
e./manage.py migrate
fonte
Você pode usar o método do Django Doc a partir desta página https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
Criar padrão e usá-lo
fonte
Você já tem entradas de banco de dados na tabela
UserProfile
? Nesse caso, quando você adiciona novas colunas, o banco de dados não sabe como definir porque não pode serNULL
. Portanto, ele pergunta como você deseja definir esses campos na colunanew_fields
. Eu tive que deletar todas as linhas desta tabela para resolver o problema.(Sei que isso foi respondido há algum tempo, mas acabei de encontrar esse problema e essa foi a minha solução. Espero que ajude alguém novo que vir isso)
fonte
Sinceramente, descobri que a melhor maneira de contornar isso era apenas criar outro modelo com todos os campos de que você precisa e com um nome um pouco diferente. Execute migrações. Exclua o modelo não utilizado e execute as migrações novamente. Voila.
fonte
Se não houver problema em truncar a tabela do modelo em questão, você pode especificar um valor padrão único de
None
no prompt. A migração terá supérfluadefault=None
enquanto seu código não tiver padrão. Pode ser aplicado muito bem porque não há mais dados na tabela que exigiriam um padrão.fonte
Eu estava no início do meu ciclo de desenvolvimento, então isso pode não funcionar para todos (mas não vejo por que não funcionaria).
Eu adicionei
blank=True, null=True
às colunas onde estava obtendo o erro. Então executei opython manage.py makemigrations
comando.Imediatamente após executar este comando (e antes de executar
python manage.py migrate
), removi oblank=True, null=True
de todas as colunas. Então corripython manage.py makemigrations
novamente. Foi-me dada a opção de apenas alterar as colunas sozinho, que selecionei.Aí corri
python manage.py migrate
e deu tudo certo!fonte
O que Django realmente diz é:
Se você tiver certeza de que nenhum dos valores na
userprofile
tabela é NULL - fique livre e ignore o aviso.A prática recomendada em tais casos seria criar uma migração RunPython para lidar com valores vazios, como afirma na opção 2
Na migração RunPython, você deve encontrar todas as
UserProfile
instâncias comnew_field
valor vazio e colocar um valor correto lá (ou um valor padrão conforme o Django pede que você defina no modelo). Você obterá algo assim:Diverta-se!
fonte
Em models.py
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")
Você precisa adicionar alguns valores como padrão.
fonte
Se o SSH lhe dá 2 opções, escolha o número 1 e coloque "Nenhum". Só isso ... por enquanto.
fonte