El modelo de Django "no declara una etiqueta de aplicación explícita"

119

Estoy al final del ingenio. Después de una docena de horas de resolución de problemas, probablemente más, pensé que finalmente estaba en el negocio, pero luego obtuve:

Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label 

Hay TAN POCA información sobre esto en la web, y ninguna solución ha resuelto mi problema. Cualquier consejo sería muy apreciado.

Estoy usando Python 3.4 y Django 1.10.

Desde mi settings.py:

INSTALLED_APPS = [
    'DeleteNote.apps.DeletenoteConfig',
    'LibrarySync.apps.LibrarysyncConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Y mis archivos apps.py se ven así:

from django.apps import AppConfig


class DeletenoteConfig(AppConfig):
    name = 'DeleteNote'

y

from django.apps import AppConfig


class LibrarysyncConfig(AppConfig):
    name = 'LibrarySync'
Slbox
fuente
2
No tiene django.contrib.contenttypes en INSTALLED_APPS.
RemcoGerlich
2
Entonces, la otra cosa probable es que lo importó antes de que se cargaran sus modelos, ¿alguna aplicación que aparece antes de los tipos de contenido en INSTALLED_APPS la usa?
RemcoGerlich
1
Eso es inusual, ¿no tienes ningún proyecto o aplicación propia?
RemcoGerlich
1
Todo lo que tiene un models.py debe estar en INSTALLED_APPS; y si uno de ellos usa contenttype (debido a una clave externa genérica, digamos) entonces debe estar bajo contenttypes en la lista.
RemcoGerlich
1
Es frustrante, es probable que sea algo muy pequeño pero difícil de decir desde aquí y dónde. ¿Importas alguna de tus cosas en settings.py o algo así?
RemcoGerlich

Respuestas:

91

¿Falta poner el nombre de su aplicación en el archivo de configuración? El myAppNameConfiges la clase por defecto generado en apps.py por el .manage.py createapp myAppName comando. Donde myAppName es el nombre de su aplicación.

settings.py

INSTALLED_APPS = [
'myAppName.apps.myAppNameConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

De esta forma, el archivo de configuración descubre cómo desea llamar a su aplicación. Puede cambiar su apariencia más adelante en el archivo apps.py agregando el siguiente código en

myAppName / apps.py

class myAppNameConfig(AppConfig):
    name = 'myAppName'
    verbose_name = 'A Much Better Name'
Xeberdee
fuente
De acuerdo, esto tiene mucho sentido para mí con el ejemplo, y ahora he implementado los cambios según mi comprensión de la sintaxis, pero sigo obteniendo el 100% del mismo error. Actualicé mi publicación para elaborar.
Slbox
2
Gracias a @xeberdee y @RemcoGerlich por su ayuda con esto. Al final, mi solución fue cargar mis aplicaciones debajo de las aplicaciones django.contrib y mover mi entrada de import django django.setup()en mi settings.py, debajo de la INSTALLED_APPSentrada.
Slbox
2
Solo por curiosidad, ¿por qué importar django django.setup () en el archivo de configuración? Además, sus aplicaciones deberían cargarse incluso si son las primeras en la lista de aplicaciones instaladas.
Xeberdee
1
¿Cuál es la diferencia entre esto y lo que escribió en su pregunta?
Matt D
1
El punto fue cómo se descubre la aplicación en la configuración INSTALLED_APPS a través del campo de nombre de la clase en el archivo de configuración. La publicación ha sido editada.
Xeberdee
34

Recibo el mismo error y no sé cómo resolver este problema. Me tomó muchas horas darme cuenta de que tengo un init.py en el mismo directorio que el manage.py de django.

Antes de:

|-- myproject
  |-- __init__.py
  |-- manage.py
  |-- myproject
    |-- ...
  |-- app1
    |-- models.py
  |-- app2
    |-- models.py

Después:

|-- myproject
  |-- manage.py
  |-- myproject
    |-- ...
  |-- app1
    |-- models.py
  |-- app2
    |-- models.py

Es bastante confuso que obtenga este error "no declara una etiqueta de aplicación explícita". Pero eliminar este archivo de inicio resolvió mi problema.

Samuel
fuente
2
Santo cielo, estuve mirando esto durante tanto tiempo, ¡gran captura!
user3167654
Estoy tratando de generar documentación usando pydoc, y mi aplicación está oculta sin init.py
Serg Smyk
20

Tuve exactamente el mismo error al ejecutar pruebas con PyCharm. Lo solucioné estableciendo explícitamente DJANGO_SETTINGS_MODULEla variable de entorno. Si está utilizando PyCharm, simplemente presione el botón Editar configuraciones y elija Variables de entorno .

Establezca la variable en your_project_name.settingsy eso debería arreglar la cosa.

Parece que se produce este error, porque PyCharm ejecuta pruebas con el suyo manage.py.

Stasdeep
fuente
1
Tuve este problema al ejecutar Pycharm Tests aunque ejecutar el servidor a través de Pycharm no requirió que agregara configuraciones. Agregar manualmente DJANGO_SETTINGS_MODULE a la configuración para la prueba resuelto si para mí.
PhoebeB
1
Además, al editar configuraciones, es útil editar las plantillas.
Yngve Høiseth
1
Configuración -> Idiomas y marcos -> Django -> Agregar un valor en la configuración se establecerá automáticamente DJANGO_SETTINGS_MODULEpara cada nueva configuración de ejecución de prueba de Django y Django.
Tobias Ernst
Para su información, hice exactamente lo que indica esta solución y no funcionó la primera vez. Resulta que PyCharm no guardó DJANGO_SETTINGS_MODULEla primera vez cuando hice clic en Applyese momento OK. Lo hice por segunda vez y ahora funciona. Parece un poco de rareza PyCharm.
MikeyE
Tenía que asegurarme de haber declarado las importaciones correctamente: desde <app>.<module> import <class>- Falta la importación automática de PyCharm <app>. Una vez que corrigí esto (también verifiqué los módulos dependientes), funcionó bien.
Matthew Hegarty
18

Obtuve este cuando lo usé, ./manage.py shell luego lo importé accidentalmente desde el directorio de nivel de proyecto raíz

# don't do this
from project.someapp.someModule import something_using_a_model
# do this
from someapp.someModule import something_using_a_model

something_using_a_model()
lukeaus
fuente
En mi caso, tuve que cambiar de from fields import xafrom .fields import x
daigorocub
13

como novato usando Python3 , encuentro que podría ser un error de importación en lugar de un error de Django

incorrecto:

from someModule import someClass

Derecha:

from .someModule import someClass

esto sucedió hace unos días, pero realmente no puedo reproducirlo ... Creo que solo las personas nuevas en Django pueden encontrar esto. Esto es lo que recuerdo:

intenta registrar un modelo en admin.py:

from django.contrib import admin
from user import User
admin.site.register(User)

intente ejecutar el servidor, el error se ve así

some lines...
File "/path/to/admin.py" ,line 6
tell you there is an import error
some lines...
Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label

cambiar usera .user, problema resuelto

rpstw
fuente
9
¡Bienvenido a stackoverflow! Me siento obligado a mencionar que su respuesta no está relacionada con la pregunta del OP. Como novato, debe tener cuidado al proponer soluciones sin verificar primero que sean correctas. Pero siga regresando y publique respuestas concretas cuando pueda, ¡gracias!
evadeflow
1
Ojalá más comentarios sobre Stack fueran como los tuyos, Xeon Phil. Demasiado a menudo los nuevos usuarios son perseguidos por comentaristas rabiosos que no están contentos de no ser expertos en Stack desde el primer día.
Slbox
1
Tienes razón, @evadeflow, mi primera respuesta parece realmente no tener relación, trato de aclarar la respuesta De todos modos, solo espero que la respuesta sea útil.
rpstw
Fue un problema similar en mi caso. 'from ..core.models import CommonInfo' tenía que convertirse en 'from apps.core.models import CommonInfo'
user42488
Este era mi problema, oscurecido porque estaba sucediendo en 2 archivos separados. ¡Maldita sea, importaciones anidadas! ¡Maldito seas, mi necio rechazo a los sensibles cambios de 2to3!
9999 años
13

Tuve el mismo problema en este momento. He arreglado el mío agregando un espacio de nombres en el nombre de la aplicación. Espero que alguien encuentre esto útil.

apps.py

from django.apps import AppConfig    

class SalesClientConfig(AppConfig):
        name = 'portal.sales_client'
        verbose_name = 'Sales Client'
Wreeecks
fuente
8

Recibí este error al importar modelos en pruebas, es decir, dada esta estructura de proyecto de Django:

|-- myproject
    |-- manage.py
    |-- myproject
    |-- myapp
        |-- models.py  # defines model: MyModel
        |-- tests
            |-- test_models.py

en el archivo test_models.pyque importé MyModelde esta manera:

from models import MyModel

El problema se solucionó si se importaba de esta manera:

from myapp.models import MyModel

¡Espero que esto ayude!

PD: Tal vez esto sea un poco tarde, pero no encontré en otras respuestas cómo resolver este problema en mi código y quiero compartir mi solución.

julio Cesar
fuente
juliocesar eres un campeón. Gracias. Este fue un error ridículo.
Kirk
2
Me tomó más de lo esperado encontrar esto. Estaba usando una importación relativa en mi archivo test.py. Recibí el error al usar from .models import MyModel. Cambiar para from myapp.models import MyModelsolucionar el problema.
monkut
@monkut lo mismo aquí. Me pregunto por qué sucede esto. Por cierto, uso la carpeta de aplicaciones personalizadas. "/ apps" en la raíz del proyecto, agregado a la ruta.
4

Después de seguir encontrándome con este problema y volver a esta pregunta, pensé en compartir cuál era mi problema.

Todo lo que @Xeberdee es correcto, así que síguelo y vea si eso resuelve el problema, si no, este era mi problema:

En mi apps.py esto es lo que tenía:

class AlgoExplainedConfig(AppConfig):
    name = 'algo_explained'
    verbose_name = "Explain_Algo"
    ....

Y todo lo que hice fue agregar el nombre del proyecto delante del nombre de mi aplicación de esta manera:

class AlgoExplainedConfig(AppConfig):
name = '**algorithms_explained**.algo_explained'
verbose_name = "Explain_Algo"

¡Y eso resolvió mi problema y pude ejecutar el comando makemigrations y migrate después de eso! buena suerte

ZaMy
fuente
3

Hoy tuve este error al intentar ejecutar pruebas de Django porque estaba usando la from .models import *sintaxis abreviada en uno de mis archivos. El problema era que tenía una estructura de archivos así:

    apps/
      myapp/
        models/
          __init__.py
          foo.py
          bar.py

y models/__init__.pyestaba importando mis modelos usando la sintaxis abreviada:

    from .foo import *
    from .bar import *

En mi aplicación estaba importando modelos así:

    from myapp.models import Foo, Bar

Esto provocó que Django model doesn't declare an explicit app_labelcuando se ejecutaba ./manage.py test.

Para solucionar el problema, tuve que importar explícitamente desde la ruta completa en models/__init__.py:

    from myapp.models.foo import *
    from myapp.models.bar import *

Eso se encargó del error.

H / t https://medium.com/@michal.bock/fix-weird-exceptions-when-running-django-tests-f58def71b59a

inostia
fuente
Este también fue el problema para mí. ¡Gracias!
Sam Creamer
3

En mi caso, esto sucedió porque utilicé una ruta de módulo relativa en urls.py a nivel de proyecto , INSTALLED_APPSy en apps.pylugar de estar enraizado en la raíz del proyecto. es decir, rutas de módulo absolutas en todo, en lugar de rutas de módulos relativos + trucos.

No importa cuánto me metí con las rutas en INSTALLED_APPSy apps.pyen mi aplicación, no pude obtener ambas runservery pytesttrabajar hasta que las tres estuvieran enraizadas en la raíz del proyecto.

Estructura de carpetas:

|-- manage.py
|-- config
    |-- settings.py
    |-- urls.py
|-- biz_portal
    |-- apps
        |-- portal
            |-- models.py
            |-- urls.py
            |-- views.py
            |-- apps.py

Con lo siguiente, podría ejecutar manage.py runservery gunicorn con wsgi y usar portalvistas de aplicaciones sin problemas, pero pytest produciría un error a ModuleNotFoundError: No module named 'apps'pesar de DJANGO_SETTINGS_MODULEestar configurado correctamente.

config / settings.py:

INSTALLED_APPS = [
    ...
    "apps.portal.apps.PortalConfig",
]

biz_portal / apps / portal / apps.py:

class PortalConfig(AppConfig):
    name = 'apps.portal'

config / urls.py:

urlpatterns = [
    path('', include('apps.portal.urls')),
    ...
]

Cambiar la referencia de aplicación en config / settings.py a biz_portal.apps.portal.apps.PortalConfigy PortalConfig.namea biz_portal.apps.portalPYtest dejarlo funcionar (no tengo pruebas para portalvistas aún), pero runserverhabría error con

RuntimeError: clase de modelo apps.portal.models.Business no declara un app_label explícito y no está en una aplicación en INSTALLED_APPS

Finalmente busqué para apps.portalver qué sigue usando una ruta relativa, y descubrí que config / urls.py también debería usar biz_portal.apps.portal.urls.

jbothma
fuente
Hacks con ruta relativa ......... Hizo lo mismo. Tus ideas me ayudaron mucho
zar3bski
2

Me encontré con este error cuando intenté generar migraciones para una sola aplicación que tenía migraciones mal formadas debido a una fusión de git. p.ej

manage.py makemigrations myapp

Cuando eliminé sus migraciones y luego ejecuté:

manage.py makemigrations

el error no ocurrió y las migraciones se generaron exitosamente.

Cerin
fuente
Gracias. Las migraciones continúan siendo frustrantes.
HashRocketSyntax
2

Tuve un problema similar, pero pude resolver el mío especificando explícitamente el app_label usando Meta Class en mi clase de modelos

class Meta:
    app_label  = 'name_of_my_app'
Benjamín Andoh
fuente
¡Gracias Benjamín! En mi proyecto Django, estoy usando Sphinx para generar documentación, y la directiva :: autoclass estaba dando el error "app_label" hasta que lo agregué a la clase Meta del modelo como sugirió.
Stefan Musarra
Me alegro de que haya funcionado para usted
Benjamin Andoh
1

Recibí este error al intentar actualizar mi aplicación Django Rest Framework a DRF 3.6.3 y Django 1.11.1.

Para cualquier otra persona en esta situación, encontré mi solución en un problema de GitHub , que era desarmar la UNAUTHENTICATED_USERconfiguración en la configuración de DRF :

# webapp/settings.py
...
REST_FRAMEWORK = {
    ...
    'UNAUTHENTICATED_USER': None
    ...
}
Robin Winslow
fuente
1

Me encontré con este problema y descubrí qué estaba saliendo mal. Dado que ninguna respuesta anterior describió el problema como me sucedió a mí, pensé que lo publicaría para otros:

  • el problema provino de usar python migrate.py startapp myAppdesde la carpeta raíz de mi proyecto, luego mover myApp a una carpeta secundaria con mv myApp myFolderWithApps/.
  • Escribí myApp.models y ejecuté python migrate.py makemigrations. Todo fue bien.
  • luego hice lo mismo con otra aplicación que estaba importando modelos de myApp. Kaboom! Me encontré con este error mientras realizaba migraciones. Eso fue porque tuve que usar myFolderWithApps.myApppara hacer referencia a mi aplicación, pero me había olvidado de actualizar MyApp / apps.py. Así que corrigí myApp / apps.py, settings / INSTALLED_APPS y mi ruta de importación en mi segunda aplicación.
  • pero luego el error siguió sucediendo: la razón fue que tuve migraciones tratando de importar los modelos de myApp con la ruta incorrecta. Intenté corregir el archivo de migración, pero llegué al punto en el que era más fácil restablecer la base de datos y eliminar las migraciones para comenzar desde cero.

Entonces, para abreviar la historia: el problema provenía inicialmente del nombre de aplicación incorrecto en apps.py de myApp, en la configuración y en la ruta de importación de mi segunda aplicación. - pero no fue suficiente para corregir las rutas en estos tres lugares, ya que las migraciones se crearon con importaciones que hacen referencia al nombre de aplicación incorrecto. Por lo tanto, siguió ocurriendo el mismo error durante la migración (excepto esta vez de las migraciones).

Entonces ... revisa tus migraciones y ¡buena suerte!

Harrouet
fuente
1

Tengo un error similar al crear una API en Django rest_framework.

RuntimeError: la clase de modelo apps.core.models.University no declara un> app_label explícito y no está en una aplicación en INSTALLED_APPS.

la respuesta de luke_aus me ayudó a corregir mi urls.py

de

from project.apps.views import SurgeryView

a

from apps.views import SurgeryView
Jade Dhangwattanotai
fuente
Para mí, lo tenía escondido en una migración. No estoy seguro de cómo sucedió eso, pero eliminar el nombre / ruta del proyecto solucionó las cosas.
Michael Thompson
1

En mi caso, recibí este error al migrar el código de Django 1.11.11 a Django 2.2. Estaba definiendo una clase derivada de FileSystemStorage personalizada. En Django 1.11.11 tenía la siguiente línea en models.py:

from django.core.files.storage import Storage, DefaultStorage

y más tarde en el archivo tenía la definición de clase:

class MyFileStorage(FileSystemStorage):

Sin embargo, en Django 2.2 necesito hacer referencia explícita a la FileSystemStorageclase al importar:

from django.core.files.storage import Storage, DefaultStorage, FileSystemStorage

y ¡voilà !, el error desaparece.

Tenga en cuenta que todos están informando la última parte del mensaje de error emitido por el servidor Django. Sin embargo, si se desplaza hacia arriba, encontrará el motivo en medio de ese error mambo-jambo.

usuario2641103
fuente
1

en mi caso, pude encontrar una solución y, al mirar el código de todos los demás, puede ser el mismo problema. Simplemente tuve que agregar 'django.contrib.sites' a la lista de aplicaciones instaladas en settings.py expediente.

Espero que esto ayude a alguien. esta es mi primera contribución a la comunidad de codificación

Jermaine Haughton
fuente
1

TL; DR: Agregar un __init__.py en blanco solucionó el problema para mí.

Recibí este error en PyCharm y me di cuenta de que mi archivo de configuración no se estaba importando en absoluto. No hubo un error obvio al decirme esto, pero cuando puse un código sin sentido en settings.py, no causó un error.

Tenía settings.py dentro de una carpeta local_settings . Sin embargo, se me había olvidado incluir un __init__.py en la misma carpeta para permitir su importación. Una vez que agregué esto, el error desapareció.

James Bradbury
fuente
1

Si tiene todas las configuraciones correctas, podría ser un desastre de importación. Esté atento a cómo está importando el modelo infractor.

Lo siguiente no funcionará from .models import Business. En su lugar, use la ruta de importación completa:from myapp.models import Business

evanxg852000
fuente
1

Si todo lo demás falla, y si ves este error al intentar importar en una "consola Python" de PyCharm (o "consola Django"):

Intente reiniciar la consola.

Esto es bastante vergonzoso, pero me tomó un tiempo darme cuenta de que me había olvidado de hacer eso.

Esto es lo que pasó:

Se agregó una aplicación nueva, luego se agregó un modelo mínimo, luego se intentó importar el modelo en la consola de Python / Django (PyCharm pro 2019.2). Esto generó el doesn't declare an explicit app_labelerror, porque no había agregado la nueva aplicación a INSTALLED_APPS. Entonces, agregué la aplicación INSTALLED_APPS, intenté la importación nuevamente, pero aún obtuve el mismo error.

Vine aquí, leí todas las demás respuestas, pero nada parecía encajar.

Finalmente me di cuenta de que aún no había reiniciado la consola de Python después de agregar la nueva aplicación a INSTALLED_APPS.

Nota: no reiniciar la consola PyCharm Python, después de agregar un nuevo objeto a un módulo, también es una excelente manera de obtener una muy confusa ImportError: Cannot import name ...

djvg
fuente
Gracias por esta respuesta, olvidé obtener mi .envarchivo y estaba haciendo todo lo posible para que las cosas funcionaran con una configuración obsoleta: /
sodimel
1

O ... M ... G También recibí este error y pasé casi 2 días en él y ahora finalmente logré resolverlo. Honestamente ... el error no tuvo nada que ver con el problema. En mi caso fue una simple cuestión de sintaxis. Estaba intentando ejecutar un módulo de Python de forma independiente que usaba algunos modelos de django en un contexto de django, pero el módulo en sí no era un modelo de django. Pero estaba declarando mal la clase

En vez de tener

class Scrapper:
    name = ""
    main_link= ""
    ...

estaba haciendo

class Scrapper(Website):
    name = ""
    main_link= ""
    ...

que obviamente está mal. El mensaje es tan engañoso que no pude evitarlo, pero creo que fue un problema con la configuración o simplemente usando django de manera incorrecta, ya que soy muy nuevo en él.

Compartiré esto aquí para alguien novato, ya que yo, pasando por la misma tontería, espero que pueda resolver su problema.

Rafael santos
fuente
0

Recibí este error después de mover el SECRET_KEYpara extraer de una variable de entorno y olvidé configurarlo al ejecutar la aplicación. Si tienes algo como esto en tusettings.py

SECRET_KEY = os.getenv('SECRET_KEY')

luego asegúrese de que está configurando la variable de entorno.

ameier38
fuente
0

Lo más probable es que tenga importaciones dependientes .

En mi caso, usé una clase de serializador como parámetro en mi modelo, y la clase de serializador estaba usando este modelo: serializer_class = AccountSerializer

from ..api.serializers import AccountSerializer

class Account(AbstractBaseUser):
    serializer_class = AccountSerializer
    ...

Y en el archivo "serializadores":

from ..models import Account

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = (
            'id', 'email', 'date_created', 'date_modified',
            'firstname', 'lastname', 'password', 'confirm_password')
    ...
Dashko Leonid
fuente
0

Recibí este error hoy y terminé aquí después de buscar en Google. Ninguna de las respuestas existentes parece relevante para mi situación. Lo único que tenía que hacer era importar un modelo de mi__init__.py archivo en el nivel superior de una aplicación. Tuve que mover mis importaciones a las funciones usando el modelo.

¡Django parece tener un código extraño que puede fallar así en tantos escenarios diferentes!

en caja
fuente
0

Recibí este error también hoy. El mensaje hace referencia a alguna aplicación específica de mis aplicaciones en INSTALLED_APPS . Pero, de hecho, no tuvo nada que ver con esta aplicación específica. Usé un nuevo entorno virtual y olvidé instalar algunas bibliotecas que usé en este proyecto. Después de instalar las bibliotecas adicionales, funcionó.

Sol de agujero negro
fuente
0

Para usuarios de PyCharm: Tuve un error al usar una estructura de proyecto no "limpia".

Estaba:

project_root_directory
└── src
    ├── chat
       ├── migrations
       └── templates
    ├── django_channels
    └── templates

Ahora:

project_root_directory
├── chat
   ├── migrations
   └── templates
       └── chat
├── django_channels
└── templates

Aquí hay muchas buenas soluciones, pero creo que, en primer lugar, debe limpiar la estructura de su proyecto o ajustar la configuración de PyCharm Django antes de configurar DJANGO_SETTINGS_MODULE variables, etc.

Espero que ayude a alguien. Salud.

Pavel Druzhinin
fuente
-1

El problema es que:

  1. Ha realizado modificaciones en su archivo de modelos, pero aún no las ha agregado a la base de datos, pero está intentando ejecutar Python manage.py runserver.

  2. Ejecute Python manage.py makemigrations

  3. Python manage.py migrar

  4. Ahora Python manage.py runserver y todo debería estar bien.

Ken Edem
fuente