unit test form create python django unit-testing django-models django-migrations

python - test - InvalidBasesError: No se pueden resolver las bases para



test post django (9)

¿Ha intentado ejecutar manage.py makemigrations <app_label> en su aplicación antes de ejecutar las pruebas?

Además, verifique si la aplicación que modelo (s) está intentando Proxy está incluida en su INSTALLED_APPS.

Cuando ejecuto pruebas recibo este error durante la inicialización de la base de datos:

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)

Creé este proxy para el modelo Contrib.auth Group para colocarlo en mi aplicación en el administrador de django:

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

Entonces, ¿qué puedo hacer para solucionar este problema?


Después de haber pasado la mayor parte de esta tarde tratando de resolver este error por mí mismo, revisando cada combinación concebible de "comentar aplicaciones", "eliminar tablas" y eliminar bases de datos completas, descubrí que mi problema se debía a una simple falta de "migraciones". carpeta y un archivo __ init__.py dentro de dicha carpeta.

Una de las respuestas anteriores que era correcta ahora ya no es correcta, ya que han solucionado el problema mencionado here .

Verifique cada directorio que contenga el modelo mencionado en ''init.py'' y debería desaparecer.

Probablemente no resolverá el caso de todos, pero ayudó al mío.


Después de mucho investigar esto, lo único que funcionó para mí fue

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

Solo una solución, pero espero que ayude a alguien.


Me he topado con este problema, y ​​como comentar el modelo no es realmente una solución, he descubierto que establecer auto_created = True para la clase Meta indocumentada hará que Django lo ignore.

class GroupProxy(Group): class Meta: proxy = True auto_created = True


Si esto solo ocurre al ejecutar la python manage.py test (tal vez porque ya ha realizado las migraciones necesarias), debe decir explícitamente que contrib.auth no debe migrar en las MIGRATION_MODULES de su módulo de configuración.

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


Simplemente creando un directorio de migrations en la raíz de su aplicación (para que los users/migrations/ en su caso) y agregando un archivo __init__.py vacío pueda resolver su problema. Al menos lo hizo por mí cuando estaba recibiendo el mismo error.

Pero es mejor que makemigrations para tu aplicación, como lo sugiere @zenofewords arriba. Eso creará el directorio para usted Y generará migraciones para sus modelos de proxy.

¿Por qué Django crea archivos de migración para modelos proxy?

Sus pruebas están buscando esas migraciones y no las están encontrando.


También me enfrenté a este problema (después de hacer un modelo complejo de herencia). Una de mis migraciones contenida.

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

shop.Entity modelo shop.Entity completo, pero la migración hacía referencia a él en el atributo de bases . Así que acabo de borrar bases=(''shop.entity'',) y funciona. Es probable que rompa la oportunidad de migrar desde el principio, pero al menos permite migrar más allá.

Otro consejo sería: ir directamente al código django e inspeccionar qué está causando problemas en las "bases". Vaya a django/db/migrations/state.py y agregue un punto de interrupción:

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,))


Tuve este problema después de cambiar el nombre de la tabla principal de un grupo de mis modelos de proxy. Lo resolví por:

  1. Elimine el archivo de migración que tenía el cambio de nombre para la tabla principal.
  2. Usando el terminal postgres, cambié el nombre de la tabla principal a su nombre anterior.
  3. Corrió las makemigrations y makemigrations nuevo.

Una posibilidad es que la eliminación o creación de un modelo en el archivo de migración esté en el orden incorrecto. Experimenté esto en Django 1.7.8 cuando el modelo base fue ANTES del modelo derivado. El intercambio de la orden para eliminar el modelo solucionó el problema.