2015-05-15 7 views
17

Wenn ich Tests laufen bekomme ich diesen Fehler bei der Datenbank Initialisierung:InvalidBasesError: Kann nicht Basen für auflösen [<Model: ‚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) 

Ich habe dieses Proxy für contrib.auth Gruppenmodell platziere es in meiner 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 

Also was kann ich tun, um dieses Problem zu beheben?

+0

@Dimitry Mikhaylov haben Sie dieses Problem lösen? Ich habe auch genau den gleichen Fehler für den Proxy, den ich gesetzt habe. Ich würde mich freuen, wenn du mir helfen kannst. – SpiXel

+0

Ich musste zuvor Migrationen für 'contrib.auth' durchführen, ansonsten funktionierte es nicht. –

+3

Möglicherweise müssen Sie einen Migrationsordner mit einem leeren __init__.py darin erstellen, damit Django die Migrationsdatei erstellen kann. Siehe die Antwort von Tamriel http://stackoverflow.com/questions/27261030/migration-error-with-django-1-7-1 – Jesuisme

Antwort

16

Nach viel auf dieser das einzige, was zu graben, die für mich gearbeitet wurde

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

nur eine Abhilfe, aber hoffentlich hilft es jemand.

6

Haben Sie versucht, manage.py makemigrations <app_label> auf Ihrer App vor dem Ausführen von Tests ausgeführt?

Überprüfen Sie auch, ob die App, welche Modelle Sie versuchen, Proxy ist in Ihrem INSTALLED_APPS enthalten.

+0

Wenn Sie 'python manage.py test 'ausführen, wird versucht, Test-DB zu erstellen und anzuwenden Alle Migrationen vor dem Ausführen von Tests. –

+0

Ich hatte bereits eine Datenbank, aber die Migrationsdateien fehlten. Nachdem ich das gemacht habe ('makemigrations '), habe ich Fehler bekommen, dass die 'app_name.model_name Tabelle bereits existiert' Ich löste das, indem ich die Migrationsdatei (' app/migrations/0001_initial.py') bearbeite und jede Zeile im Kommentar auskommentierte 'operations = [...]' liste. – Keith

0

Wenn dies nur passiert, wenn python manage.py test ausgeführt wird (möglicherweise, weil Sie die erforderlichen Migrationen bereits durchgeführt haben), sollten Sie explizit angeben, dass contrib.auth nicht in die MIGRATION_MODULES Ihres Einstellungsmoduls migriert werden soll.

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

ich auf dieses Thema gekommen sind, und wie das Modell zu kommentieren, ist nicht wirklich eine Lösung, habe ich festgestellt, dass die nicht dokumentierte auto_created = True auf die Meta-Klasse Einstellung machen Django ignorieren.

+0

Dies wird jedoch Probleme beim Erstellen der Berechtigungen für diese Anwendungen verursachen, also verwenden Sie es mit Sorgfalt – XelharK

+0

Hat überhaupt nicht funktioniert. –

0

Ich hatte dieses Problem, nachdem ich die Elterntabelle einer Reihe meiner Proxy-Modelle umbenannt hatte. Ich löste es durch:

  1. Löschen Sie die Migrationsdatei, die den Namen für die übergeordnete Tabelle geändert hatte.
  2. Mit dem Postgres-Terminal habe ich die Elterntabelle in den vorherigen Namen umbenannt.
  3. Ran makemigrations und migrate wieder
4

einfach ein migrations Verzeichnis an der Wurzel Ihrer Anwendung (so users/migrations/ in Ihrem Fall) und das Hinzufügen eine leere __init__.py-Datei erstellen kann Ihr Problem beheben. Zumindest hat es für mich getan, als ich den gleichen Fehler bekam.

Aber Sie sind besser dran, makemigrations für Ihre App zu laufen, wie von @zenofewords oben vorgeschlagen. Dadurch wird das Verzeichnis für Sie erstellt und Migrationen für Ihre Proxy-Modelle generiert.

Why does Django create migration files for proxy models?

Ihre Tests sind für diese Migrationen und finden sie nicht.

1

Ich war auch auf dieses Problem (nach einigen komplexen Modellvererbung).Einer meiner Migrationen enthalten

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

I shop.Entity Modell vollständig gelöscht, aber die Migration wurde in bases Attribut verweist. Also habe ich gerade bases=('shop.entity',) gelöscht und es funktioniert. Es wird wahrscheinlich eine Gelegenheit zur Migration von Anfang an durchbrechen, zumindest aber eine weitere Migration ermöglichen.

Ein weiterer Tipp wäre: Gehen Sie direkt zum Django-Code und überprüfen Sie, was "Basen" Probleme verursacht. Zum django/db/migrations/state.py und einen Haltepunkt hinzu:

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

Nachdem die Mehrheit der heute Nachmittag damit verbracht, diese Störung selbst zu lösen, durch jede denkbare Mischung geht von ‚auszukommen Apps‘, ‚Drop Tabellen‘ und fallen ganze Datenbanken I Ich habe festgestellt, dass mein Problem durch ein einfaches Fehlen eines Migrationsordners und einer __ init__.py-Datei in diesem Ordner verursacht wurde.

Eine der älteren Antworten, die korrekt war, ist jetzt nicht mehr korrekt, da sie das Problem here behoben haben.

Überprüfen Sie jedes Verzeichnis, das das in 'init.py' erwähnte Modell enthält, und es sollte verschwinden.

Wahrscheinlich wird nicht jedermanns Fall lösen, aber es half mir.

Verwandte Themen