Django - makemigrations - Nenhuma alteração detectada


138

Eu estava tentando criar migrações em um aplicativo existente usando o comando makemigrations, mas ele produz "Nenhuma alteração detectada".

Geralmente, crio novos aplicativos usando o startappcomando, mas não o usei para esse aplicativo quando o criei.

Após a depuração, descobri que ele não está criando a migração porque o migrationspacote / pasta está ausente em um aplicativo.

Seria melhor se ele criar a pasta se ela não estiver lá ou estiver faltando alguma coisa?


13
Você adicionou seu aplicativo ao INSTALLED_APPS?
Wolendranh

6
Sim, é no aplicativo instalado, pela primeira vez, melhor usar makemigrations <myapp>como Alasdair apontou também.
Dilraj 22/03

1
Remova 'abstract = True' :) :)
GrvTyagi

'makemigrations' não funcionou. 'makemigrations <myapp>' trabalhou
Aseem

Respostas:


266

Para criar migrações iniciais para um aplicativo, execute makemigrationse especifique o nome do aplicativo. A pasta de migrações será criada.

./manage.py makemigrations <myapp>

Seu aplicativo deve ser incluído INSTALLED_APPSprimeiro (dentro de settings.py).


15
Alguma idéia de por que às vezes nos força a especificar o aplicativo?
maazza

40
@maazza, você precisa especificar o nome do aplicativo se o aplicativo não tiver migrationspasta. Isso pode acontecer se você criou o aplicativo manualmente ou atualizou a partir de uma versão mais antiga do Django que não possui migrações.
precisa

13
@maazza Na verdade, você precisa de um pacote python (com __init__.py) chamado 'migrations' no aplicativo.
Jibin

3
Parece algo que o Django deve manipular automaticamente.
duality_

1
@duality_ é por design - o Django não assume que você deseja migrações para o seu aplicativo. Se ele criou migrações para todos os aplicativos, isso pode levar a erros quando você executa migrate.
Alasdair

49

Meu problema (e, portanto, solução) ainda era diferente dos descritos acima.

Eu não estava usando o models.pyarquivo, mas criei um modelsdiretório e criei o my_model.pyarquivo lá, onde coloquei meu modelo. O Django não conseguiu encontrar meu modelo, por isso escreveu que não há migrações a serem aplicadas.

Minha solução foi: no my_app/models/__init__.pyarquivo eu adicionei esta linha: from .my_model import MyModel


Essa também foi a solução para mim, mas não entendo por que isso acontece. Alguém tem alguma idéia do que pode estar causando isso?
Paul in 't Hout

O Django tem um caminho padrão de onde procurar seus modelos. Se a estrutura do projeto for diferente e os modelos não estiverem no local usual, eles precisam ser importados para lá.
Karina Klinkevičiūtė 15/04/19

@ KarinaKlinkevičiūtė e se eu precisar remover esses modelos?
Daniil Mashkin

@DaniilMashkin Imagino que você precisaria remover as importações também. Esta é uma das maneiras de estruturar seu projeto (não o único) e você tem que lidar com tarefas adicionais que vem com ele se você escolhê-lo :)
Karina Klinkevičiūtė

1
Usei a arquitetura "clássica" para modelos, depois migrei para a arquitetura "pasta de modelos" e qualquer migração ainda é detectada nos meus modelos existentes. No entanto, agora, ao criar um novo modelo, eu tenho esse problema. Sua solução funciona bem, mas deixou minha base de código meio inconsistente, porque às vezes há uma importação, às vezes não. Talvez haja uma solução melhor. Eu acho que o Django deve propor uma configuração com uma lista de pastas para procurar ao tentar encontrar novos modelos.
David D.

43

Existem vários motivos possíveis para o django não detectar o que migrar durante o makemigrationscomando.

  1. pasta de migração Você precisa de um pacote de migrações no seu aplicativo.
  2. INSTALLED_APPS Você precisa que seu aplicativo seja especificado no INSTALLED_APPS.dict
  3. Amakemigrations -v 3 verbosidade começa executando para verbosidade. Isso pode lançar alguma luz sobre o problema.
  4. Caminho completo em INSTALLED_APPSque é recomendado para especificar o módulo caminho completo aplicativo config 'apply.apps.MyAppConfig'
  5. --settings, convém garantir que o arquivo de configurações correto esteja definido:manage.py makemigrations --settings mysite.settings
  6. especifique o nome do aplicativo e coloque explicitamente o nome do aplicativo manage.py makemigrations myapp- que restringe as migrações somente para o aplicativo e ajuda a isolar o problema.
  7. meta modelo verificar você tem o direito app_labelem seu modelo meta

  8. Debug django script de depuração do django core. O comando makemigrations é bastante direto. Veja como fazê-lo em pycharm . alterar a sua definição de script em conformidade (ex: makemigrations --traceback myapp)

Vários bancos de dados:

  • Db Router ao trabalhar com o django db router, a classe do roteador (sua classe de roteador personalizada) precisa implementar o allow_syncdbmétodo.

makemigrations sempre cria migrações para alterações de modelo, mas se allow_migrate () retorna False,


1
Cobertos muitos cenários sobre o problema, deve ser a resposta aceita.
Krishh

Outra possibilidade: o nome errado está sendo importado, ou seja, importar um campo de formulários em vez de campos ou importar um modelo de formulários em vez de modelos. Um exemplo: from recurrence.forms import RecurrenceFieldmas deveria ter sido from recurrence.fields import RecurrenceField.
Hlongmore 27/04/19

Mais um motivo. Certifique-se de que o modelo seja usado dentro de uma rota para o site (via administrador ou não). "O makemigrationsscript procura modelos que estão conectados urls.py". Encontrado aqui stackoverflow.com/questions/43093651/…
Kyle

cmd example:python manage.py makemigrations -v 3 <app_name>
Charlie 木匠 02/07

Quando adiciono uma tabela e, em seguida, adicione uma chave estrangeira referencie essa nova tabela ao mesmo tempo. Ele deve ser dividido em 2 etapas: pré etapa: adicione INSTALLED_APPS às configurações. 1) crie uma nova tabela: python manage.py makemigrations <app_name>; 2) adicionar chave estrangeira: python manage.py makemigrations
Charlie

26

Eu já li muitas respostas para essa pergunta, afirmando simplesmente executar de makemigrationsoutras maneiras. Mas para mim, o problema estava na Metasubclasse de modelos.

Eu tenho uma configuração de aplicativo que diz label = <app name>(no apps.pyarquivo, ao lado models.py, views.pyetc). Se, por acaso, sua classe meta não tiver o mesmo rótulo que o rótulo do aplicativo (por exemplo, porque você está dividindo um aplicativo grande demais em vários), nenhuma alteração será detectada (e nenhuma mensagem de erro útil). Então, na minha classe de modelo, tenho agora:

class ModelClassName(models.Model):

    class Meta:
        app_label = '<app name>' # <-- this label was wrong before.

    field_name = models.FloatField()
    ...

Executando o Django 1.10 aqui.


13

É um comentário, mas provavelmente deve ser uma resposta.

Verifique se o nome do seu aplicativo está em settings.py, INSTALLED_APPScaso contrário, não importa o que você faça, não executará as migrações.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',
]

Então corra:

./manage.py makemigrations blog

mas cria o nome da tabela como 'appname_modelname', quando executamos o comando 'manage.py migrate'
Daniyal Javaid 14/01/19

Veja as meta opções do modelo para alterar o nome da tabela
stephen

11

Eu tive outro problema não descrito aqui, o que me deixou louco.

class MyModel(models.Model):
    name = models.CharField(max_length=64, null=True)  # works
    language_code = models.CharField(max_length=2, default='en')  # works
    is_dumb = models.BooleanField(default=False),  # doesn't work

Eu tinha um ',' à direita, em uma linha, talvez de copiar e colar. A linha com is_dumb não criou uma migração de modelo com './manage.py makemigrations', mas também não gerou um erro. Depois de remover o ',' funcionou como esperado.

Portanto, tenha cuidado ao copiar e colar :-)


A vírgula à direita também pode causar erros em outros lugares; a vírgula torna a instrução uma tupla, portanto is_dumbé igual a (models.BooleanField(default=False), )que makemigrationsnão sabe como converter em uma coluna do banco de dados.
Hlongmore 27/04/19

8

Às vezes, quando ./manage.py makemigrationsé superior, ./manage.py makemigrations <myapp>porque ele pode lidar com certos conflitos entre aplicativos.

Essas ocasiões ocorrem silenciosamente e leva várias horas swearingpara entender o real significado da No changes detectedmensagem temida .

Portanto, é uma escolha muito melhor usar o seguinte comando:

./manage.py makemigrations <myapp1> <myapp2> ... <myappN>


7

Eu copiei uma tabela de fora do django e a classe Meta assumiu o padrão "managed = false". Por exemplo:

class Rssemailsubscription(models.Model):
    id = models.CharField(primary_key=True, max_length=36)
    ...
    area = models.FloatField('Area (Sq. KM)', null=True)

    class Meta:
        managed = False
        db_table = 'RSSEmailSubscription'

Ao mudar manged para True, as migrações começaram a captar as alterações.


4
  1. Verifique se o seu aplicativo é mencionado em installed_apps em settings.py
  2. Certifique-se de que a classe model estenda os modelos.

2

Eu resolvi esse problema fazendo o seguinte:

  1. Apague o arquivo "db.sqlite3". O problema aqui é que sua base de dados atual será apagada, portanto você precisará refazê-la novamente.
  2. Dentro da pasta de migrações do seu aplicativo editado, apague o último arquivo atualizado. Lembre-se de que o primeiro arquivo criado é: "0001_initial.py". Por exemplo: criei uma nova classe e a registrei pelos procedimentos "makemigrations" e "migrate", agora um novo arquivo chamado "0002_auto_etc.py" foi criado; apague isso.
  3. Vá para a pasta " pycache " (dentro da pasta de migrações) e apague o arquivo "0002_auto_etc.pyc".
  4. Por fim, acesse o console e use "python manage.py makemigrations" e "python manage.py migrate".

2

Esqueci de colocar argumentos corretos:

class LineInOffice(models.Model):   # here
    addressOfOffice = models.CharField("Корхоная жош",max_length= 200)   #and here
    ...

em models.py e, em seguida, começou a deixar cair esse irritante

Nenhuma alteração detectada no aplicativo 'myApp'


2

Outro motivo possível é se você definiu alguns modelos em outro arquivo (não em um pacote) e não o referenciou em nenhum outro lugar.

Para mim, simplesmente adicionando from .graph_model import *a admin.py(onde graph_model.pyfoi o novo arquivo) corrigiu o problema.


2

Meu problema era muito mais simples do que as respostas acima e provavelmente um motivo muito mais comum, desde que seu projeto já esteja configurado e funcionando. Em um dos meus aplicativos que trabalhavam há muito tempo, as migrações pareciam complicadas, então, com pressa, fiz o seguinte:

rm -r */migrations/*
rm db.sqlite3
python3 manage.py makemigrations
No changes detected

O que ??

Por engano, eu também removi todos os __init__.pyarquivos :( - Tudo estava funcionando novamente depois que entrei e:

touch ads1/migrations/__init__.py

Para cada um dos meus aplicativos, makemigrationsfuncionou novamente.

Acontece que eu criei manualmente um novo aplicativo copiando outro e esqueci de colocar o arquivo __init__.pyna migrationspasta e isso me confinou que tudo estava errado - levando a piorar com o rm -rdescrito acima.

Espero que isso ajude alguém a xingar o erro "Nenhuma alteração detectada" por algumas horas.


1

A solução é que você precise incluir seu aplicativo em INSTALLED_APPS.

Eu perdi e encontrei esse mesmo problema.

depois de especificar a migração do nome do meu aplicativo se tornou bem-sucedida

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'boards',
]

observe que mencionei as placas por último, que é o nome do meu aplicativo.


1

INSTALLED_APPS = [

'blog.apps.BlogConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

]

certifique-se de 'blog.apps.BlogConfig', (isso está incluído no seu settings.py para fazer migrações no seu aplicativo)

em seguida, execute o blog python3 manage.py makemigrations ou o nome do seu aplicativo


1

Uma questão muito idiota que você pode ter também é definir dois class Metano seu modelo. Nesse caso, qualquer alteração na primeira não será aplicada durante a execução makemigrations.

class Product(models.Model):
    somefield = models.CharField(max_length=255)
    someotherfield = models.CharField(max_length=255)

    class Meta:
        indexes = [models.Index(fields=["somefield"], name="somefield_idx")]

    def somefunc(self):
        pass

    # Many lines...

    class Meta:
        indexes = [models.Index(fields=["someotherfield"], name="someotherfield_idx")]

1

Sei que essa é uma pergunta antiga, mas lutei com esse mesmo problema o dia todo e minha solução foi simples.

Eu tive minha estrutura de diretórios algo ao longo das linhas de ...

apps/
   app/
      __init__.py
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

E como todos os outros modelos até o modelo com o qual eu tinha problemas estavam sendo importados para outro lugar que acabou importando do main_appqual estava registrado no INSTALLED_APPS, tive a sorte de que todos eles funcionaram.

Mas desde que eu só acrescentou cada apppara INSTALLED_APPSe não o app_sub*quando eu finalmente acrescentou um novo arquivo de modelos que não foi importado qualquer outro lugar, Django totalmente ignorado-lo.

Minha correção foi adicionar um models.pyarquivo ao diretório base de cada um appassim ...

apps/
   app/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

e adicione from apps.app.app_sub1 import *e assim por diante a cada um dos arquivos de appnível models.py.

Bleh ... isso me levou tanto tempo para descobrir e eu não consegui encontrar a solução em nenhum lugar ... Eu até fui para a página 2 dos resultados do google.

Espero que isso ajude alguém!


1

Eu tive um problema semelhante com o django 3.0, de acordo com a seção de migrações na documentação oficial , executando isso foi suficiente para atualizar minha estrutura de tabela:

python manage.py makemigrations
python manage.py migrate

Mas a saída sempre foi a mesma: 'nenhuma alteração detectada' sobre meus modelos depois de executar o script 'makemigrations'. Eu tive um erro de sintaxe em models.py no modelo que eu queria atualizar no db:

field_model : models.CharField(max_length=255, ...)

ao invés de:

field_model = models.CharField(max_length=255, ...)

Resolvendo esse erro estúpido, com esses comandos a migração foi feita sem problemas. Talvez isso ajude alguém.


0

Você deve adicionar polls.apps.PollsConfiga INSTALLED_APPSemsetting.py


0

No meu caso, esqueci de inserir os argumentos da classe

Errado:

class AccountInformation():

Corrigir

class AccountInformation(models.Model):

0

No meu caso, adicionei um campo ao modelo e o Django disse que não há alterações.

Depois que eu decidi alterar o "nome da tabela" do modelo, as migrações funcionaram. Depois alterei o nome da tabela para o padrão, e o novo campo também estava lá.

Há um "bug" no sistema de migração do django, às vezes ele não vê o novo campo. Pode estar relacionado ao campo de data.


0

O possível motivo pode ser a exclusão do arquivo db existente e da pasta de migrações. Você pode usar python. manage.py makemigrations <app_name>Isso deve funcionar. Uma vez eu enfrentei um problema semelhante.


0

Mais um caso de ponta e solução:

Adicionei um campo booleano e, ao mesmo tempo, adicionei uma propriedade @ referenciando-o, com o mesmo nome (doh). Comentou a propriedade e a migração vê e adiciona o novo campo. Renomeou a propriedade e tudo é bom.


0

Se você possui o managed = Truemodelo Meta, é necessário removê-lo e fazer uma migração. Em seguida, execute as migrações novamente, ele detectará as novas atualizações.


0

Ao adicionar novos modelos ao aplicativo django api e executar python manage.py makemigrationsa ferramenta, não detectou novos modelos.

O estranho é que os modelos antigos foram escolhidos makemigrations, mas isso foi porque eles foram referenciados na urlpatternscadeia e a ferramenta de alguma forma os detectou. Portanto, fique de olho nesse comportamento.

O problema ocorreu porque a estrutura de diretórios correspondente ao pacote de modelos tinha subpacotes e todos os __init__.pyarquivos estavam vazios. Eles devem importar explicitamente todas as classes necessárias em cada subpasta e nos modelos __init__.py para o Django buscá-las com a makemigrationsferramenta.

models
  ├── __init__.py          <--- empty
  ├── patient
     ├── __init__.py      <--- empty
     ├── breed.py
     └── ...
  ├── timeline
     ├── __init__.py      <-- empty
     ├── event.py
     └── ...

0

Tente registrar seu modelo no admin.py, veja um exemplo: - admin.site.register (YourModelHere)

Você pode fazer o seguinte: - 1. admin.site.register (YourModelHere) # No admin.py 2. Recarregue a página e tente novamente 3. Pressione CTRL-S e salve 4. Pode haver um erro, especialmente nos modelos .py e admin.py 5. Ou, no final de tudo, basta reiniciar o servidor


0

Espero que isso ajude alguém, pois acabei passando horas tentando perseguir isso.

Se você tiver uma função no seu modelo com o mesmo nome, isso removerá o valor. Bastante óbvio em retrospectiva, mas mesmo assim.

Então, se você tem algo parecido com isto:

class Foobar(models.Model):
    [...]
    something = models.BooleanField(default=False)

    [...]
    def something(self):
        return [some logic]

Nesse caso, a função substituirá a configuração acima, tornando-a "invisível" para makemigrations.


0

A melhor coisa que você pode fazer é excluir o banco de dados existente. No meu caso, eu estava usando o banco de dados phpMyAdmin SQL, então excluí manualmente o banco de dados criado.

Após a exclusão: eu crio o banco de dados no PhpMyAdmin e não adiciono nenhuma tabela.

Novamente, execute os seguintes comandos:

python manage.py makemigrations

python manage.py migrate

Após estes comandos : Você pode ver que o django criou automaticamente outras tabelas necessárias no banco de dados (aproximadamente 10 tabelas).

python manage.py makemigrations <app_name>

python manage.py migrate

E por último: Após os comandos acima, todo o modelo (tabela) que você criou é importado diretamente para o banco de dados.

Espero que isso ajude.


0

Meu problema com esse erro foi que eu incluí:

class Meta:
   abstract = True

Modelo interno para o qual eu queria criar a migração.


0

Eu tive um problema diferente ao criar um novo aplicativo chamado deals. Eu queria separar os modelos dentro desse aplicativo para ter dois arquivos de modelo nomeados deals.pye dealers.py. Ao executar python manage.py makemigrationseu tenho: No changes detected.

Fui em frente e dentro do __init__.pyque mora no mesmo diretório em que meus arquivos de modelo residiam (negócios e revendedor).

from .deals import *
from .dealers import *

E então o makemigrationscomando funcionou.

Acontece que, se você não estiver importando os modelos em nenhum lugar OU o nome do arquivo dos modelos não estiver models.py, os modelos não serão detectados.

Outro problema que aconteceu comigo é a maneira como escrevi o aplicativo settings.py:

Eu tinha:

apps.deals

Deveria estar incluindo a pasta do projeto raiz:

cars.apps.deals
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.