Django 1.7 - makemigrations no detecta cambios

140

Como dice el título, parece que no puedo hacer que las migraciones funcionen.

La aplicación originalmente era inferior a 1.6, por lo que entiendo que las migraciones no estarán allí inicialmente, y de hecho si ejecuto python manage.py migrateme sale:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

Si hago un cambio en algún modelo myapp, todavía dice no inmigrado, como se esperaba.

Pero si corro python manage.py makemigrations myappme sale:

No changes detected in app 'myapp'

No parece importar qué o cómo ejecuto el comando, nunca detecta que la aplicación tenga cambios, ni agrega ningún archivo de migración a la aplicación.

¿Hay alguna forma de forzar una aplicación a las migraciones y esencialmente decir "Esta es mi base para trabajar" o algo así? ¿O me estoy perdiendo algo?

Mi base de datos es PostgreSQL si eso ayuda.

TyrantWave
fuente
Las soluciones ofrecidas no me funcionaron, así que aquí está mi solución si alguien se enfrenta al mismo problema. 1. Eliminar archivos de migraciones en todas las aplicaciones 2. Eliminar la base de datos y volver a crearla 3. ejecutar makemigrations y migrar comandos PS Pruebe primero los pasos 1 y 3. Si todavía hay un error, siga los pasos 1-3.
Amoroso

Respuestas:

187

Si está cambiando de una aplicación existente que creó en django 1.6, entonces necesita hacer un paso previo (como descubrí) enumerado en la documentación:

python manage.py makemigrations your_app_label

La documentación no hace obvio que necesita agregar la etiqueta de la aplicación al comando, ya que lo primero que le dice que haga es python manage.py makemigrationsqué fallará. La migración inicial se realiza cuando crea su aplicación en la versión 1.7, pero si viniera de 1.6 no se habría llevado a cabo. Consulte 'Agregar migración a aplicaciones' en la documentación para obtener más detalles.

drojf
fuente
1
¡Buena respuesta para las personas que vienen de Django 1.6! ¡Gracias!
David D.
1
¿Qué pasa si tengo mucho más de una aplicación? ¿Debo hacerlo python manage.py makemigrations APP_LABELpara cada uno?
Alston
1
Bajo Django 1.9 aquí y mi aplicación fue creada con ./manage.py startapp, pero todavía tenía que mencionar explícitamente la etiqueta
maxbellec
50

Esto puede ocurrir debido a las siguientes razones:

  1. No agregó la aplicación en la INSTALLED_APPSlista settings.py (debe agregar el nombre de la aplicación o la ruta punteada a la subclase de AppConfig en apps.py en la carpeta de la aplicación, dependiendo de la versión de django que esté usando). Consulte la documentación: INSTALLED_APPS
  2. No tienes una migrationscarpeta dentro de esas aplicaciones. (Solución: solo cree esa carpeta).
  3. No tienes un __init__.pyarchivo dentro de la migrationscarpeta de esas aplicaciones. (Solución: simplemente cree un archivo vacío con el nombre __init__.py )
  4. No tienes un __init__.pyarchivo dentro de la carpeta de la aplicación. (Solución: simplemente cree un archivo vacío con el nombre __init__.py )
  5. No tienes un models.pyarchivo en la aplicación
  6. Su clase de Python (que se supone que es un modelo) models.pyno heredadjango.db.models.Model
  7. Tiene algún error semántico en la definición de modelos en models.py

Nota: Un error común es agregar una migrationscarpeta en el .gitignorearchivo. Cuando se clona desde un repositorio remoto, faltan migrationscarpetas y / o __init__.pyarchivos en el repositorio local. Esto causa un problema.

Sugiero gitignore los archivos de migración agregando las siguientes líneas al .gitignorearchivo

*/migrations/*
!*/migrations/__init__.py
Mohammed Shareef C
fuente
1
Había clonado mi proyecto y la carpeta de migraciones no se introdujo en el repositorio, así que tuve que agregar el director de migraciones, luego agregué init .py y pude hacer migraciones. Gracias a usted
Junaid
Eliminé el contenido de mi carpeta / migrations para "restablecer" cosas en un proyecto que aún no había implementado. Inadvertidamente eliminé la __init__.pycarpeta junto con las migraciones.
Seth
Esto lo hizo por mí ... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py)y fue causado al agregar los archivos a.gitignore
lukik
1
¿Por qué el archivo init .py es tan importante en la carpeta de migraciones? hacer migraciones? ¿Dónde puedo profundizar en esta lógica?
Nimish Bansal
1
@NimishBansal Hasta el __init__.pyarchivo python 3.3 se requiere dentro de un directorio para que sea tratado como un paquete python. ver esto
Mohammed Shareef C
29

Ok, parece que me perdí un paso obvio, pero publicar esto en caso de que alguien más haga lo mismo.

Al actualizar a 1.7, mis modelos quedaron sin administrar ( managed = False): los tenía como Trueantes, pero parece que se revirtieron.

Al eliminar esa línea (de forma predeterminada a Verdadero) y luego ejecutarla makemigrationsinmediatamente, creó un módulo de migración y ahora está funcionando. makemigrationsno funcionará en tablas no administradas (lo cual es obvio en retrospectiva)

TyrantWave
fuente
44
Por favor aclare: ¿dónde cambió / agregó "managed = False"? Tengo el mismo problema
Ycon
1
Ya no tengo ese código, pero creo que es una propiedad de la clase si no recuerdo mal.
TyrantWave
1
Buen punto. Tenga en cuenta que manage.py inspectdbagrega manage = False! en caso de importar bases de datos heredadas, debe ajustarlo cuidadosamente.
Alessandro Dentella
@TyrantWave, me salvaste el día. Muchas gracias.
Utkarsh Sharma
asegúrate de que app_labelsea ​​igual
Luv33preet
19

Mi solución no estaba cubierta aquí, así que la estoy publicando. Lo había estado usando syncdbpara un proyecto, solo para ponerlo en marcha. Luego, cuando traté de comenzar a usar las migraciones de Django, al principio las fingió y luego dijo que estaba 'OK', pero no estaba sucediendo nada en la base de datos.

Mi solución fue simplemente eliminar todos los archivos de migración para mi aplicación, así como los registros de la base de datos para las migraciones de la aplicación en la django_migrationstabla.

Luego acabo de hacer una migración inicial con:

./manage.py makemigrations my_app

seguido por:

./manage.py migrate my_app

Ahora puedo hacer migraciones sin problemas.

Grant Eagon
fuente
FYI: es crítico que él diga aquí, "los archivos, así como los registros de la base de datos". Si elimina los registros de la base de datos pero no los archivos también (a excepción de __init.py__, no funcionará.)
Mike Robinson
15

De acuerdo con @furins. Si todo parece estar en orden y surge este problema, verifique si hay algún método de propiedad con el mismo título que el atributo que está intentando agregar en la clase Modelo.

  1. Elimine el método con un nombre similar al atributo que está agregando.
  2. manage.py makemigrations my_app
  3. manage.py migrate my_app
  4. Agregue los métodos de nuevo.
Prashant Nair
fuente
11

Es un error estúpido, pero tener una coma adicional al final de la línea de declaración de campo en la clase de modelo hace que la línea no tenga efecto.

Sucede cuando copia y pega el def. de la migración, que se define como una matriz.

Aunque tal vez esto ayudaría a alguien :-)

Iman Akbari
fuente
1
¡Tu comentario me ayudó a encontrar mi problema! No tenía una coma al final de la última opción en una lista de opciones ... aparentemente Django es muy delicado.
Maxim
1
@Maxim: esa era la causa poco probable de su problema: una lista sin una coma al final sigue siendo una lista. Otro asunto son las tuplas: si solo tiene 1 elemento en una tupla, necesita una coma después.
blueFast
amigo que me ahorró mucho tiempo! @dangonfast: en la definición del Modelo, es realmente un problema.
MrE
11

Tal vez sea demasiado tarde, pero ¿trataste de tener una migrationscarpeta en tu aplicación con un __init__.pyarchivo?

rrrub
fuente
1
Si tiene este "makemigrations" creará las migraciones para la aplicación. De lo contrario, será necesario que ejecutes makemigrations app_name (que crea estos archivos)
Scott Warren
7

Quizás esto ayude a alguien. Estaba usando una aplicación anidada. project.appname y en realidad tenía project y project.appname en INSTALLED_APPS. Eliminar el proyecto de INSTALLED_APPS permitió detectar los cambios.

jaywhy13
fuente
7

La respuesta está en esta publicación de stackoverflow, por cdvv7788 Migraciones en Django 1.7

Si es la primera vez que está migrando esa aplicación, debe usarla:

manage.py makemigrations myappname Una vez que hagas eso, puedes hacer:

manage.py migrate Si tenía su aplicación en la base de datos, modificó su modelo y no actualiza los cambios en makemigrations, probablemente aún no la haya migrado. Cambie su modelo a su forma original, ejecute el primer comando (con el nombre de la aplicación) y migre ... lo falsificará. Una vez que haga eso, vuelva a colocar los cambios en su modelo, ejecute makemigrations y migre nuevamente y debería funcionar.

Estaba teniendo exactamente el mismo problema y hacer lo anterior funcionó perfectamente.

Había movido mi aplicación django a cloud9 y por alguna razón nunca capté la migración inicial.

MicahT
fuente
7

Lo siguiente funcionó para mí:

  1. Agregue el nombre de la aplicación a settings.py
  2. use 'python manage.py makemigrations'
  3. use 'python manage.py migrate'

Trabajó para mí: Python 3.4, Django 1.10

Pranshu Gupta
fuente
6

Las personas como yo a las que no les gustan las migraciones pueden usar los pasos a continuación.

  1. Elimine los cambios que desea sincronizar.
  2. Ejecutar python manage.py makemigrations app_labelpara la migración inicial.
  3. Ejecute python manage.py migratepara crear tablas antes de realizar cambios.
  4. Pegue los cambios que elimine en el primer paso.
  5. Ejecute los pasos 2. y 3.

Si confundió alguno de estos pasos, lea los archivos de migración. Cámbielos para corregir su esquema o elimine los archivos no deseados, pero no olvide cambiar la parte de dependencias del próximo archivo de migración;)

Espero que esto ayude a alguien en el futuro.

Deniz Kaplan
fuente
5

Desea verificar settings.pyen la INSTALLED_APPSlista y asegurarse de que todas las aplicaciones con modelos estén enumeradas allí.

La ejecución makemigrationsen la carpeta del proyecto significa que buscará actualizar todas las tablas relacionadas con todas las aplicaciones incluidas settings.pypara el proyecto. Una vez que lo incluya, makemigrationsincluirá automáticamente la aplicación (esto ahorra mucho trabajo para que no tenga que ejecutar makemigrations app_namecada aplicación en su proyecto / sitio).

Pegajoso
fuente
5

En caso de que tenga un campo específico que no sea identificado por makemigrations: verifique dos veces si tiene una propiedad con el mismo nombre.

ejemplo:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

la propiedad "sobrescribirá" la definición del campo para que los cambios no sean identificados por makemigrations

furins
fuente
Un fastidio relacionado es tener un campo con formato incorrecto que todavía escapa a la validación / verificación. Definí hourly_rate = models.DecimalField(falta el '()' final y simplemente falló en silencio.
sabio
5

Asegúrese de que su modelo no lo sea abstract. Realmente cometí ese error y me tomó un tiempo, así que pensé en publicarlo.

marca
fuente
4

Agregar esta respuesta porque solo este método me ayudó.

Eliminé la migrationscarpeta ejecutar makemigrationsy migrate.
Todavía decía: no hay migraciones para aplicar.

Fui a la migratecarpeta y abrí el último archivo creado,
comenté la migración que quería (se detectó e ingresó allí)
y ejecuté migratenuevamente.

Esto básicamente edita el archivo de migraciones manualmente.
Haga esto solo si comprende el contenido del archivo.

Jithin Pavithran
fuente
1
Muchas gracias! Esto ayudó
Sharpless512
3

¿Lo usó schemamigration my_app --initialdespués de cambiar el nombre de la carpeta de migración anterior? Intentalo. Podría funcionar. Si no es así, intente recrear la base de datos y realice syncdb + migrate. A mí me funcionó ...

Alex Vidis
fuente
10
No schemamigrationexiste un comando , ¿creo que eso es parte del Sur? Actualmente no tengo una carpeta de migración. Eliminar mi models.pyy volver a ejecutar inspectdbno parecía hacer nada.
TyrantWave
2
schemamigrationera del sur makemigrationsEs su reemplazo.
Craig Labenz
2
Esto sigue siendo válido. Pero cambió amakemigrations --empty
Iulius Curt
2

Tuve el mismo problema Asegúrese de que las clases que haya definido en models.py, debe tener que heredar la clase models.Model.

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()
Sonu Kumar
fuente
1

Tuve el mismo problema con tener que hacer makemigrations dos veces y todo tipo de comportamientos extraños. Resultó que la raíz del problema era que estaba usando una función para establecer fechas predeterminadas en mis modelos, por lo que las migraciones detectaban un cambio cada vez que ejecutaba makemigrations. La respuesta a esta pregunta me puso en el camino correcto: evite hacer migraciones para volver a crear el campo de fecha

PhoebeB
fuente
1

Recientemente actualicé Django de 1.6 a 1.8 y tenía pocas aplicaciones y migraciones para ellos. Utilicé el sur y schemamigrationspara crear migraciones en Django 1.6, que se eliminó en Django 1.8.

Cuando agregué nuevos modelos después de la actualización, el makemigrationscomando no detectó ningún cambio. Y luego probé la solución sugerida por @drojf (primera respuesta), funcionó bien, pero no pudo aplicar la migración inicial falsa ( python manage.py --fake-initial). Estaba haciendo esto ya que mis tablas (tablas antiguas) ya estaban creadas.

Finalmente, esto funcionó para mí, eliminé nuevos modelos (o cambios de modelos) de models.py y luego tuve que eliminar (o cambiar el nombre de la copia de seguridad) la carpeta de migraciones de todas las aplicaciones y ejecutar python manage.pymakemigrations para todas las aplicaciones, luego lo hice python manage.py migrate --fake-initial. Funcionó como por arte de magia. Una vez que se crea la migración inicial para todas las aplicaciones y la migración inicial falsa, se agregan nuevos modelos y se sigue el proceso regular makemigrationsy se migra en esa aplicación. Los cambios se detectaron ahora y todo salió bien.

Solo pensé en compartirlo aquí, si alguien enfrenta el mismo problema (tener schemamigrationssur para sus aplicaciones), podría ayudarlos :)

RaghavHarpale
fuente
1

Tal vez eso pueda ayudar a alguien, tuve el mismo problema.

Ya he creado dos tablas con la clase serializador y las vistas. Entonces, cuando quería actualizar, tuve este error.

Seguí estos pasos:

  1. hice .\manage.py makemigrations app
  2. Yo ejecuté .\manage.py migrate
  3. Borré las dos tablas de mi models.py
  4. Borré toda referencia a mis tablas del serializador y la clase de vista.
  5. Ejecuté paso 1y 2.
  6. Recuperé mis cambios solo en el models.py
  7. Ejecuté de nuevo paso 5.
  8. Restablecí todos mis cambios.

Si está trabajando con Pycharm, la historia local es muy útil.

huellas dactilares
fuente
1

Quizás esto ayude a alguien.

He eliminado mi models.pyy esperaba makemigrationscrear DeleteModeldeclaraciones.

¡Recuerda eliminar *.pycarchivos!

Sebastian Wagner
fuente
1
./manage makemigrations
./manage migrate

Las migraciones rastrean los cambios en la base de datos, por lo que si está cambiando de no administrado a administrado, deberá asegurarse de que su tabla de base de datos esté actualizada en relación con el modelo con el que está tratando.

Si todavía está en modo de desarrollo, personalmente decidí eliminar los archivos de migración en mi IDE, así como en la tabla django_migrations relacionada con mi modelo y volver a ejecutar el comando anterior.

RECUERDE: si tiene una migración que termina con _001 en su IDE y _003 en su base de datos. Django solo verá si tiene una migración que termine con _004 para actualizar algo.

Los 2 (migraciones de código y db) están vinculados y funcionan en tándem.

Feliz codificación

AH Bensiali
fuente
1
  1. Elimine los cambios que desea sincronizar.
  2. Ejecute python manage.py makemigrations app_label para la migración inicial.
  3. Ejecute python manage.py migrate para crear tablas antes de realizar cambios.
  4. Pegue los cambios que elimine en el primer paso.
  5. Ejecute los pasos 2. y 3.
Vijay Choudhary
fuente
0

Agregué esta respuesta porque ninguna de las otras disponibles anteriormente funcionó para mí.

En mi caso, sucedía algo aún más extraño ( versión Django 1.7 ), en mi models.py tenía una línea "extra" al final de mi archivo (era una línea en blanco) y cuando ejecuté el python manage.py makemigrationscomando el resultado fue: "no se detectaron cambios".

Para solucionar esto, eliminé esta "línea en blanco" que estaba al final de mi archivo models.py y ejecuté el comando nuevamente, ¡todo se solucionó y se detectaron todos los cambios realizados en models.py !

Huskie
fuente
Bueno, en django 2.0 + esa línea vacía es necesaria, creo, tuve que hacer lo contrario de lo que hiciste amigo
Sumit Kumar Saha
@SumitKumarSaha jaja Estoy usando actualmente la versión Django 1.7 y esa línea en blanco fue la razón de 2 horas intentando todo para resolver el error de migración. Gracias por compartir Sumit. Que tengas un buen día
Huskie
0

Es posible que deba simular las migraciones iniciales con el siguiente comando

python manage.py migrate --fake-initial
dtar
fuente
0

Primero, esta solución es aplicable a aquellos que enfrentan el mismo problema durante la implementación en el servidor heroku, yo estaba enfrentando el mismo problema.

Para implementar, hay un paso obligatorio que es agregar django_heroku.settings (locals ()) en el archivo settings.py.

Cambios: cuando cambié la línea anterior a django_heroku.settings (locales (), bases de datos = Falso), funcionó a la perfección.

Rishabh Aher
fuente
0

En mi caso, necesitaba agregar mi modelo al archivo _ init _.py de la carpeta de modelos donde se definió mi modelo:

from myapp.models.mymodel import MyModel
robert wallace
fuente
-1

Agregando mi 2c, ya que ninguna de estas soluciones funcionó para mí, pero esto hizo ...

Acababa de ejecutar manage.py squashmigrationsy eliminar las migraciones antiguas (tanto los archivos como las líneas en la tabla de la base de datos django.migrations).

Esto dejó una línea como esta en el último archivo de migración:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

Esto aparentemente confundió a Django y causó un comportamiento extraño: la ejecución manage.py makemigrations my_apprecrearía la migración inicial como si no existiera ninguno. ¡Eliminar la replaces...línea solucionó el problema!

webtweakers
fuente
-1

python manage.py makemigrations accounts Migraciones para 'cuentas': accounts \ migrations \ 0001_initial.py - Crear modelo Cliente - Crear modelo Etiqueta - Crear modelo Producto - Crear modelo Pedido

Nota: aquí "cuentas" es el nombre de mi aplicación

Vijay Choudhary
fuente