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?
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.
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
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.
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.
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.
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,))
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.
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:
makemigrations
et migrate
encoreSi 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",
)