2015-05-15 5 views
17

Quando eseguo test ottengo questo errore durante l'inizializzazione del database:InvalidBasesError: Impossibile risolvere basi per [<ModelState: 'users.GroupProxy'>]

django.db.migrations.state.InvalidBasesError: Cannot resolve bases for [<ModelState: 'users.GroupProxy'>] 
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth) 

Ho creato questo proxy per il modello contrib.auth Gruppo inseriscilo nella mia app in django admin:

class GroupProxy(Group): 
    class Meta: 
     proxy = True 
     verbose_name = Group._meta.verbose_name 
     verbose_name_plural = Group._meta.verbose_name_plural 

Quindi, cosa posso fare per risolvere questo problema?

+0

@Dimitry Mikhaylov hai risolto questo problema? Sto anche affrontando lo stesso errore per il proxy che ho impostato. Sarei felice se tu mi possa aiutare. – SpiXel

+0

Ho dovuto eseguire le migrazioni per 'contrib.auth' prima, altrimenti non funzionava. –

+3

Potrebbe essere necessario creare una cartella di migrazione con un __init__.py vuoto in modo che Django possa effettivamente creare il file di migrazione. Vedere la risposta di Tamriel http://stackoverflow.com/questions/27261030/migration-error-with-django-1-7-1 – Jesuisme

risposta

16

Dopo un sacco di scavare su questo l'unica cosa che ha funzionato per me è stato

comment out the offending apps, run migrations, then add them in again.

Un semplice trucco, ma si spera che aiuta qualcuno.

6

Hai provato a eseguire manage.py makemigrations <app_label> sulla tua app prima di eseguire i test?

Inoltre, controllare se l'app che modello (i) si sta provando a Proxy è inclusa in INSTALLED_APPS.

+0

quando si esegue 'python manage.py test' si tenterà di creare DB di test e applicare tutte le migrazioni prima di eseguire i test. –

+0

Ho già un database, ma mancavano i file di migrazione. Dopo averlo fatto ('makemigrations '), ho ricevuto degli errori che la tabella 'nome_nome.model esiste già! Ho risolto questo problema modificando il file di migrazione (' app/migrations/0001_initial.py') e commentando ogni riga nel 'operazioni = [...]' lista. – Keith

0

Se ciò accade solo quando è in esecuzione python manage.py test (forse perché sono già state effettuate le migrazioni necessarie), è necessario dire esplicitamente che contrib.auth non deve migrare nello MIGRATION_MODULES del modulo delle impostazioni.

MIGRATION_MODULES(
     'auth': "contrib.auth.migrations_not_used_in_tests", 
) 
10

ho incontrato questo problema, e come commentando la modella non è davvero una soluzione, ho trovato che l'impostazione non documentata auto_created = True alla classe Meta renderà Django ignorarlo.

class GroupProxy(Group): 

    class Meta: 
     proxy = True 
     auto_created = True 
+0

Ciò causerà problemi durante la creazione delle autorizzazioni per tali app, quindi usalo con attenzione – XelharK

+0

Non ha funzionato affatto. –

0

Ho avuto questo problema dopo aver rinominato la tabella padre di un gruppo di miei modelli proxy. Ho risolto il problema:

  1. Elimina il file di migrazione con la modifica del nome per la tabella padre.
  2. Utilizzando il terminale Postgres, ho rinominato la tabella padre con il nome precedente.
  3. Ran makemigrations e migrate nuovo
4

semplice fatto di creare una directory migrations alla radice della vostra applicazione (in modo users/migrations/ nel tuo caso) e l'aggiunta di un file vuoto __init__.py potrebbe risolvere il problema. Almeno lo ha fatto per me quando ricevevo lo stesso errore.

Ma è meglio utilizzare makemigrations per la tua app, come suggerito da @zenofewords sopra. Questo creerà la directory per te E genererà migrazioni per i tuoi modelli proxy.

Why does Django create migration files for proxy models?

i test sono alla ricerca di quelle migrazioni e non stanno trovando loro.

1

Ho anche affrontato questo problema (dopo aver eseguito un modello complesso di ereditarietà).Uno dei miei migrazioni conteneva

migrations.CreateModel(
    name='Offer', 
    fields=[ 
     # ... 
    ], 
    options={ 
     # ... 
    }, 
    bases=('shop.entity',), 
), 

ho cancellato shop.Entity modello del tutto, ma la migrazione è stata Referencing in attributo bases. Quindi ho appena cancellato bases=('shop.entity',) e funziona. Probabilmente interromperà l'opportunità di migrare dall'inizio, ma almeno permetterà di migrare ulteriormente.

Un altro consiglio potrebbe essere: andare direttamente al codice django e ispezionare cosa causa problemi "basi". Vai a django/db/migrations/state.py e aggiungere un punto di interruzione:

try: 
    bases = tuple(
     (apps.get_model(base) if isinstance(base, six.string_types) else base) 
     for base in self.bases 
    ) 
except LookupError: 
    print(self.bases) # <-- print the bases 
    import ipdb; ipdb.set_trace() # <-- debug here 
    raise InvalidBasesError("Cannot resolve one or more bases from %r" % (self.bases,)) 
0

Dopo aver trascorso la maggior parte di questo pomeriggio, cercando di risolvere questo errore io stesso, passando per ogni miscela immaginabile di 'commentando le app', 'lasciando cadere le tabelle' e far cadere interi database I ho riscontrato che il mio problema era causato da una semplice mancanza di una cartella "migrazioni" e un file __ init__.py all'interno di detta cartella.

Una delle risposte più vecchie che era corretta ora non è più corretta in quanto hanno risolto il problema menzionato here.

Controllare ogni directory che contiene il modello menzionato in 'init.py' e dovrebbe andare via.

Probabilmente non risolverà il caso di tutti ma ha aiutato il mio.

Problemi correlati