wake-up-neo.com

InvalidBasesError: Basen für [<ModelState: 'users.GroupProxy'> "] können nicht aufgelöst werden

Wenn ich Tests durchführe, erhalte ich diesen Fehler während der Datenbankinitialisierung:

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 diesen Proxy für das contrib.auth Group-Modell erstellt, um es in meiner App im Django-Admin zu platzieren:

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

Was kann ich also tun, um dieses Problem zu beheben?

20

Nach vielem Graben war das einzige, was für mich funktionierte

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

Nur ein Workaround, aber hoffentlich hilft es jemandem.

20
dlsso

Ich bin auf dieses Problem gestoßen, und da das Modell durch Auskommentieren nicht wirklich eine Lösung ist, habe ich festgestellt, dass das Festlegen des undokumentierten auto_created = True auf die Meta-Klasse dazu führt, dass Django es ignoriert.

class GroupProxy(Group):

    class Meta:
        proxy = True
        auto_created = True
13
Augusto Men

Wenn Sie einfach ein migrations-Verzeichnis im Stammverzeichnis Ihrer App erstellen (in Ihrem Fall also users/migrations/), und eine leere __init__.py-Datei hinzufügen, kann das Problem möglicherweise behoben werden. Zumindest tat es für mich, als ich denselben Fehler bekam.

Sie sollten jedoch besser makemigrations für Ihre App ausführen, wie in @ Zenofewords oben vorgeschlagen. Dadurch wird das Verzeichnis für Sie erstellt und Migrationen für Ihre Proxy-Modelle generiert.

Warum erstellt Django Migrationsdateien für Proxy-Modelle?

Ihre Tests suchen nach diesen Migrationen und finden sie nicht.

11
tino

Haben Sie versucht, manage.py makemigrations <app_label> in Ihrer App auszuführen, bevor Sie Tests ausführen?

Prüfen Sie auch, ob die App, welches bzw. welche Modelle Sie als Proxy versuchen, in Ihrem INSTALLED_APPS enthalten ist.

7
zenofewords

Nachdem ich den größten Teil des Nachmittags damit verbracht habe, diesen Fehler selbst zu beheben, jede denkbare Mischung aus "Auskommentieren von Apps", "Löschen von Tabellen" und Löschen ganzer Datenbanken durchforstet, stellte ich fest, dass mein Problem auf einem einfachen Mangel an "Migrationen" beruht. Ordner und eine __ init__.py-Datei in diesem Ordner.

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

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

Vermutlich wird nicht jeder Fall gelöst, aber es hat mir geholfen.

4
Tom Pegler

Ich war auch mit diesem Problem konfrontiert (nachdem ich einige komplexe Modellvererbungen durchgeführt hatte). Eine meiner Migrationen enthielt 

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

Ich habe shop.Entity model vollständig gelöscht, aber die Migration referenzierte darauf im bases-Attribut. Also habe ich gerade bases=('shop.entity',) gelöscht und es funktioniert. Es wird wahrscheinlich eine Migrationsmöglichkeit von Anfang an brechen, aber es erlaubt zumindest eine weitere Migration.

Ein anderer Rat wäre: Gehen Sie direkt zum Django-Code und prüfen Sie, was "Grundprobleme" verursacht. Gehe zu Django/db/migrations/state.py und füge 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,))
3
MrKsn

Eine Möglichkeit ist, dass das Löschen oder Erstellen eines Modells in der Migrationsdatei in der falschen Reihenfolge erfolgt. Ich habe dies in Django 1.7.8 erlebt, als das Basismodell VOR dem abgeleiteten Modell war. Durch das Austauschen der Reihenfolge zum Löschen des Modells wurde das Problem behoben.

0
dustinrwh

Ich hatte dieses Problem, nachdem ich die übergeordnete Tabelle einer Reihe meiner Proxy-Modelle umbenannt hatte. Ich habe es gelöst durch:

  1. Löschen Sie die Migrationsdatei, deren Name für die übergeordnete Tabelle geändert wurde.
  2. Mit dem Postgres-Terminal habe ich die übergeordnete Tabelle in ihren vorherigen Namen umbenannt.
  3. Läuft wieder makemigrations und migrate
0

Wenn dies nur beim Ausführen von python manage.py test geschieht (möglicherweise weil Sie bereits die erforderlichen Migrationen durchgeführt haben), sollten Sie ausdrücklich sagen, dass contrib.auth nicht im MIGRATION_MODULES Ihres Einstellungsmoduls migriert werden sollte.

MIGRATION_MODULES(
        'auth': "contrib.auth.migrations_not_used_in_tests",
)
0
Iván Alegre