sqlmigrate migrations makemigrations error detected changes all django django-models django-migrations

migrations - Django 1.7: migraciones que crean la migración para un modelo no administrado



migrations django command (3)

Estoy creando algunos modelos dinámicos de Django en mi aplicación y todo parece funcionar como se esperaba, excepto el sistema de migración.

Si creo un modelo dinámico de Django y configuro administrado = Falso, el comando makemigrations de Django aún genera una migración para ese nuevo modelo. La migración se ve algo así:

class Migration(migrations.Migration): dependencies = [ (''atom'', ''0001_initial''), ] operations = [ migrations.CreateModel( name=''books'', fields=[ ], options={ ''db_table'': ''books'', ''managed'': False, }, bases=(models.Model,), ), ]

Si no creo la migración, cuando ejecuto python manage.py migrate , veo el siguiente mensaje (en grandes letras rojas de miedo):

Your models have changes that are not yet reflected in a migration, and so won''t be applied. Run ''manage.py makemigrations'' to make new migrations, and then re-run ''manage.py migrate'' to apply them.

¿Hay alguna manera de indicar al sistema de migraciones en Django 1.7 que ignore todos los modelos no administrados? ¿O quizás una migrations = False configuración migrations = False en la clase Meta de los modelos?

ACTUALIZACIÓN: para aclarar, estoy usando un método para crear mis modelos dinámicos similares a los que se describen en los siguientes lugares:

Este método es excelente para generar mis modelos dinámicos basados ​​en la información almacenada en mis modelos de configuración ( https://code.djangoproject.com/wiki/DynamicModels#Adatabase-drivenapproach ). Tuve que registrar una señal para borrar el caché de modelo de django para detectar cambios en los modelos cuando se cambia una instancia de Configuración, pero todo parece estar funcionando muy bien, excepto por el hecho de que se generan migraciones para estos modelos. Si elimino una de las configuraciones y el modelo se elimina de la caché de Django, la migración debería actualizarse nuevamente, eliminando el modelo que no debería preocuparle.

Estos modelos dinámicos no se utilizan específicamente en la aplicación. En ninguna parte del código me refiero a un modelo de libros (del ejemplo anterior). Se generan en tiempo de ejecución y se utilizan para leer información de las tablas heredadas a las que proporcionan acceso.


La respuesta corta es que Django no está construido para esto. Hacer que su modelo sea "no administrado" solo significa que Django no creará ni eliminará la tabla para él, nada más .

Dicho esto, si no tiene modelos regulares junto con estos modelos dinámicos en la misma aplicación, puede agregar condicionalmente la aplicación a INSTALLED_APPS en settings.py :

if not (''makemigrations'' in sys.argv or ''migrate'' in sys.argv): INSTALLED_APPS += ( ''app_with_dynamic_models'', ''another_app_with_dynamic_models'', )

Esto debería hacer que Django ignore la aplicación al crear y ejecutar migraciones. Sin embargo, eventualmente tendrá que hacer y ejecutar migraciones para los modelos si desea usarlos, ya que la capacidad de tener aplicaciones que no usan migraciones debe desaparecer en Django 1.9 . ¿Se podrían refactorizar sus modelos dinámicos para usar el marco de contenidos ?


Le sugiero que reemplace las migrations.CreateModel generadas. Cree una operación de modelado por una propia que siempre refleje el estado real del modelo. De esta manera no se deben detectar cambios de estado.

class CreateDynamicModel(CreateModel): def __init__(self): # ... dynamically generate the name, fields, options and bases super(CreateDynamicModel, self).super( name=name, fields=fields, options=optins, bases=bases )


Probablemente pueda escribir un enrutador de base de datos personalizado con el método allow_migrate devolviendo False para sus modelos dinámicos. El comando migrate no los permitirá en ese caso.

Mientras no cargues estos modelos dinámicos en ningún módulo de models.py , makemigrations tampoco debería recogerlos.