2014-10-28 18 views
14

Sto creando alcuni modelli dinamici Django nella mia applicazione e tutto sembra funzionare come previsto tranne che per il sistema di migrazione.Django 1.7 - makemigrations che creano la migrazione per il modello non gestito

Se creo un modello Django dinamico e impostato managed = False, il comando makemigrations di Django genera ancora una migrazione per quel nuovo modello. La migrazione simile a questa:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('atom', '0001_initial'), 
    ] 

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

Se io non creo la migrazione, quando corro python manage.py migrate, vedo il seguente messaggio (in grandi lettere rosse spaventosi):

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. 

Is c'è un modo per dire al sistema di migrazioni in Django 1.7 di ignorare tutti i modelli non gestiti tutti insieme? o forse un'impostazione migrations = False nella classe Meta dei modelli?

UPDATE: di chiarimenti, sto usando un metodo per creare i miei modelli dinamici simili a quelli di descrivere nei seguenti luoghi:

Questo il metodo è ottimo per generare i miei modelli dinamici in base alle informazioni memorizzate nei miei modelli di configurazione (https://code.djangoproject.com/wiki/DynamicModels#Adatabase-drivenapproach). Dovevo registrare un segnale per cancellare la cache del modello django per rilevare le modifiche ai modelli quando viene modificata un'istanza di Configuration, ma tutto sembra funzionare alla grande, tranne per il fatto che le migrazioni sono generate per questi modelli. Se elimino una delle configurazioni e il modello viene eliminato dalla cache di Django, la migrazione dovrebbe essere nuovamente aggiornata, rimuovendo il modello che non dovrebbe interessare.

Questi modelli dinamici non sono utilizzati specificamente nell'applicazione. No dove nel codice faccio riferimento a un modello di libri (dall'esempio sopra). Vengono generati in fase di esecuzione e utilizzati per leggere le informazioni dalle tabelle legacy a cui forniscono l'accesso.

+0

Ma la migrazione in realtà sta causando un problema? Cioè, quando esegui "migrate" crea erroneamente i modelli nel database? In caso contrario, non c'è davvero alcun problema. Il sistema di migrazione non riguarda solo le modifiche a livello di database, ma cerca di creare un'immagine più precisa possibile dei modelli nella memoria. –

+0

Questo è corretto. Le migrazioni non stanno causando un problema. Tuttavia, in un sistema dinamico, dove ci sono potenzialmente nuovi modelli per tutto il tempo. Sarebbe bello se potessi indicare al sistema di migrazione che non ha bisogno di preoccuparsi di questi particolari modelli. – chadgh

+0

Potresti fornirci maggiori dettagli su come vengono generati i tuoi modelli dinamici? Principalmente quali dati sono necessari per generarli dinamicamente. –

risposta

4

La risposta breve è che Django non è stato progettato per questo. Rendere il tuo modello "non gestito" only means Django will not create or delete the table for it -- nothing else.

Detto questo, se non si hanno modelli regolari accanto a questi modelli dinamici nella stessa applicazione, è possibile condizionale aggiungere l'app per INSTALLED_APPS in settings.py:

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

questo dovrebbe rendere Django ignorare l'applicazione durante la creazione e eseguire le migrazioni. Tuttavia, dovrai eventualmente eseguire ed eseguire migrazioni per i modelli se desideri utilizzarli, dal the ability to have apps which do not use migrations is meant to go away in Django 1.9. I tuoi modelli dinamici potrebbero essere refactored per utilizzare lo contenttypes framework?

+0

Questo è stato un salvavita, grazie! – arctelix

+0

Fallisce per me su Django 1.11.5. Django tenta ancora di creare una tabella django_migrations nel database precedente che contiene la tabella non gestita. – user1255933

1

È possibile scrivere un router di database personalizzato con il metodo allow_migrate restituendo False per i modelli dinamici. In tal caso, il comando migrate non li consente.

Finché non si caricano questi modelli dinamici in alcun modulo models.py, non è necessario che vengano prelevati anche da makemigrations.

+1

Bene, questo mi dà qualcosa di più vicino, ma non è proprio così. Quando eseguo il comando makemigrations, i modelli dinamici sono ancora visibili e le migrazioni vengono create per loro. Tuttavia, non esegue la migrazione per tali tabelle/modelli. Magari ci sarebbe qualcosa di simile a un metodo 'allow_makemigrations' che potrei anche scavalcare. – chadgh

2

Suggerisco di sostituire l'operazione generata migrations.CreateModel con una propria che riflette sempre lo stato del modello effettivo. In questo modo non dovrebbero essere mai rilevati cambiamenti di stato.

Problemi correlati