web-dev-qa-db-fra.com

InvalidBasesError: Impossible de résoudre les bases pour [<ModelState: 'users.GroupProxy'>]

Lorsque j'effectue des tests, j'obtiens cette erreur lors de l'initialisation de la base de données:

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)

J'ai créé ce proxy pour le modèle contrib.auth Group afin de le placer dans mon application sous Django admin:

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

Alors, que puis-je faire pour résoudre ce problème?

20

Après beaucoup de recherches, la seule chose qui a fonctionné pour moi a été

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

Juste une solution de contournement, mais j'espère que cela aidera quelqu'un.

20
dlsso

J'ai rencontré ce problème et comme le commentaire du modèle n'est pas vraiment une solution, j'ai constaté que le fait de définir le auto_created = True non documenté dans la classe Meta ferait en sorte que Django l'ignore.

class GroupProxy(Group):

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

Créer simplement un répertoire migrations à la racine de votre application (donc users/migrations/ dans votre cas) et ajouter un fichier __init__.py vide pourraient résoudre votre problème. Au moins, c'est ce qui s'est passé pour moi lorsque j'ai eu la même erreur.

Mais il vaut mieux utiliser makemigrations pour votre application, comme suggéré par @ Zenofewords ci-dessus. Cela créera le répertoire pour vous ET générera des migrations pour vos modèles de proxy.

Pourquoi Django crée-t-il des fichiers de migration pour les modèles de proxy?

Vos tests recherchent ces migrations et ne les trouvent pas.

11
tino

Avez-vous essayé d'exécuter manage.py makemigrations <app_label> sur votre application avant d'exécuter des tests?

Vérifiez également si l’application pour laquelle vous essayez d’utiliser le proxy est incluse dans votre INSTALLED_APPS.

7
zenofewords

Après avoir passé la majeure partie de cet après-midi à essayer de résoudre cette erreur moi-même, en passant en revue toutes les combinaisons imaginables de "commentaire d'applications", de "suppression de tables" et de suppression de bases de données entières, j'ai constaté que mon problème était dû à un simple manque de "migration". dossier et un fichier __ init__.py à l’intérieur de ce dossier.

Une des réponses les plus anciennes, qui était correcte, n’est plus correcte car elles ont résolu le problème mentionné ici .

Vérifiez chaque répertoire contenant le modèle mentionné dans 'init.py' et il devrait disparaître.

Cela ne réglera probablement pas le cas de tout le monde mais cela a aidé le mien.

4
Tom Pegler

J'ai également fait face à ce problème (après avoir fait un héritage modèle complexe). Une de mes migrations contenues 

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

J'ai entièrement supprimé le modèle shop.Entity, mais la migration le référençait dans l'attribut bases. Donc, je viens de supprimer bases=('shop.entity',) et cela fonctionne. Cela coupera probablement une opportunité de migrer depuis le début, mais permet au moins de migrer plus loin.

Un autre conseil serait: allez directement dans le code Django et inspectez ce qui cause des problèmes aux "bases". Allez à Django/db/migrations/state.py et ajoutez un point d'arrêt:

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

Une possibilité est que la suppression ou la création d'un modèle dans le fichier de migration se déroule dans le mauvais ordre. Je l'ai expérimenté dans Django 1.7.8 lorsque le modèle de base était AVANT le modèle dérivé. Échanger la commande pour supprimer le modèle a résolu le problème.

0
dustinrwh

J'ai eu ce problème après avoir renommé la table parente d'un groupe de mes modèles de proxy. Je l'ai résolu par:

  1. Supprimez le fichier de migration dont le nom a été modifié pour la table parent.
  2. En utilisant le terminal postgres, j'ai renommé la table parente avec son nom précédent.
  3. Ran makemigrations et migrate encore
0
Christopher Compeau

Si cela se produit uniquement lors de l'exécution de python manage.py test (peut-être parce que vous avez déjà effectué les migrations nécessaires), vous devez explicitement indiquer que contrib.auth ne doit pas migrer dans le MIGRATION_MODULES de votre module de paramètres.

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