O modelo Django “não declara um app_label explícito”

119

Estou perdendo o juízo. Depois de uma dúzia de horas de solução de problemas, provavelmente mais, pensei que finalmente estava no negócio, mas então:

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

Há MUITAS informações sobre isso na web, e nenhuma solução por aí resolveu meu problema. Qualquer conselho seria extremamente apreciado.

Estou usando Python 3.4 e Django 1.10.

De minhas configurações.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',
]

E meus arquivos apps.py são assim:

from django.apps import AppConfig


class DeletenoteConfig(AppConfig):
    name = 'DeleteNote'

e

from django.apps import AppConfig


class LibrarysyncConfig(AppConfig):
    name = 'LibrarySync'
Slbox
fonte
2
Você não tem django.contrib.contenttypes no INSTALLED_APPS.
RemcoGerlich
2
Então a outra coisa provável é que você importou antes de seus modelos serem carregados, algum aplicativo que está listado antes de contenttypes em INSTALLED_APPS está usando-o?
RemcoGerlich
1
Isso é incomum, você não tem nenhum projeto ou aplicativo próprio?
RemcoGerlich
1
Tudo o que tem um models.py deve estar no INSTALLED_APPS; e se um deles usa contenttype (por causa de uma chave estrangeira genérica, digamos), então ele precisa estar em contenttypes na lista.
RemcoGerlich
1
Frustrante, é provável que seja algo muito pequeno, mas difícil dizer de onde. Você importa algum de seus itens em settings.py ou assim?
RemcoGerlich

Respostas:

91

Você não está colocando o nome do seu aplicativo no arquivo de configurações? A myAppNameConfigé a classe padrão gerada em apps.py pelo comando .manage.py createapp myAppName . Onde myAppName é o nome do seu aplicativo.

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',
]

Dessa forma, o arquivo de configurações descobre como você deseja chamar seu aplicativo. Você pode alterar sua aparência mais tarde no arquivo apps.py adicionando o seguinte código em

myAppName / apps.py

class myAppNameConfig(AppConfig):
    name = 'myAppName'
    verbose_name = 'A Much Better Name'
Xeberdee
fonte
Ok, então isso faz muito sentido para mim com o exemplo, e agora implementei as alterações com base no meu entendimento da sintaxe, mas ainda estou atingindo 100% exatamente o mesmo erro. Eu atualizei meu post para elaborar.
Slbox
2
Obrigado a @xeberdee e @RemcoGerlich por sua ajuda com isso. No final, minha solução foi carregar meus aplicativos abaixo dos aplicativos django.contrib e mover minha entrada de import django django.setup()em meu settings.py para abaixo da INSTALLED_APPSentrada.
Slbox
2
Só por curiosidade - por que importar django django.setup () no arquivo de configurações? Além disso, seus aplicativos devem carregar mesmo se forem os primeiros na lista de aplicativos instalados.
Xeberdee
1
Qual é a diferença entre isso e o que ele escreveu em sua pergunta?
Matt D
1
O ponto era como o aplicativo é descoberto nas configurações INSTALLED_APPS através do campo de nome da classe no arquivo de configuração. A postagem foi editada.
Xeberdee
36

Recebo o mesmo erro e não sei como resolver este problema. Levei muitas horas para perceber que tenho um init.py no mesmo diretório que o manage.py do django.

Antes:

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

Depois de:

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

É bastante confuso que você receba este erro "não declara um app_label explícito". Mas excluir este arquivo init resolveu meu problema.

samuel
fonte
2
Caramba, eu estava olhando para isso por tanto tempo - grande pegada!
user3167654
Estou tentando gerar documentação usando pydoc e meu aplicativo está oculto sem init.py
Serg Smyk
20

Eu tive exatamente o mesmo erro ao executar testes com PyCharm. Eu corrigi isso definindo explicitamente DJANGO_SETTINGS_MODULEa variável de ambiente. Se você estiver usando o PyCharm, basta clicar no botão Editar Configurações e escolher Variáveis ​​de Ambiente .

Defina a variável como your_project_name.settingse isso deve corrigir a coisa.

Parece que esse erro ocorre, porque o PyCharm executa testes com o seu próprio manage.py.

Stasdeep
fonte
1
Tive esse problema ao executar os testes do Pycharm, embora a execução do servidor por meio do Pycharm não exigisse a adição de configurações. Adicionando DJANGO_SETTINGS_MODULE manualmente à configuração para teste resolvido para mim.
PhoebeB de
1
Além disso, ao editar configurações, é útil editar os modelos.
Yngve Høiseth
1
Configurações -> Idiomas e estruturas -> Django -> Adicionar um valor nas configurações será definido automaticamente DJANGO_SETTINGS_MODULEpara cada nova configuração de execução de teste do Django e Django.
Tobias Ernst
FYI, fiz exatamente como indicado por esta solução e não funcionou da primeira vez. Acontece que, PyCharm não salvou o DJANGO_SETTINGS_MODULEpela primeira vez quando eu cliquei Applyem seguida OK. Eu fiz isso pela segunda vez e agora funciona. Parece um pouco estranho do PyCharm.
MikeyE
Tive de certificar-me de que declarava as importações corretamente: de <app>.<module> import <class>-PyCharm auto import estava faltando <app>. Depois de corrigir isso (também verifiquei os módulos dependentes), funcionou bem.
Matthew Hegarty
18

Eu ganhei este quando usei o ./manage.py shell então importei acidentalmente do diretório raiz do nível do projeto

# 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
fonte
no meu caso, tive que mudar de from fields import xparafrom .fields import x
daigorocub
13

como novato usando Python3 , acho que pode ser um erro de importação em vez de um erro de Django

errado:

from someModule import someClass

certo:

from .someModule import someClass

isso aconteceu há alguns dias, mas eu realmente não consigo reproduzir ... Acho que apenas pessoas novas no Django podem encontrar isso. aqui está o que eu lembro:

tente registrar um modelo em admin.py:

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

tente executar o servidor, o erro parece com este

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

mudar userpara .user, problema resolvido

rpstw
fonte
9
Bem-vindo ao stackoverflow! Sinto-me compelido a mencionar que sua resposta não está relacionada à pergunta do OP. Como novato, você deve ser cuidadoso ao propor soluções sem primeiro verificar se estão corretas. Mas, por favor, continue voltando e poste respostas concretas quando puder - obrigado!
evadeflow
1
Gostaria que mais comentários sobre Stack fossem como os seus, Xeon Phil. Freqüentemente, novos usuários são perseguidos por comentaristas raivosos e insatisfeitos por não serem especialistas em Stack no primeiro dia.
Slbox de
1
Você está certo, @evadeflow, minha primeira resposta parece realmente não relacionada, eu tento esclarecer a resposta. De qualquer forma, apenas espero que a resposta possa ser útil.
rpstw
Foi um problema semelhante no meu caso. 'from ..core.models import CommonInfo' tinha que se tornar 'from apps.core.models import CommonInfo'
user42488
Este era o meu problema, obscurecido porque estava acontecendo em 2 arquivos separados. Droga, importações aninhadas! Droga, minha rejeição tola das mudanças sensatas do 2to3!
9999 anos,
13

Eu tive o mesmo problema agora. Eu consertei o meu adicionando um namespace ao nome do aplicativo. Espero que alguém ache isso útil.

apps.py

from django.apps import AppConfig    

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

Recebi este erro ao importar modelos em testes, ou seja, dada esta estrutura de projeto Django:

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

no arquivo test_models.pyque importei MyModeldesta forma:

from models import MyModel

O problema foi corrigido se for importado desta forma:

from myapp.models import MyModel

Espero que isto ajude!

PS: Talvez seja um pouco tarde, mas não encontrei em outras pessoas como resolver esse problema no meu código e quero compartilhar minha solução.

Julio Cesar
fonte
juliocesar você é um campeão. Obrigado. Este foi um erro ridículo.
Kirk
2
Levei mais tempo do que o esperado para encontrar isso. Eu estava usando uma importação relativa em meu arquivo test.py. Recebi o erro ao usar from .models import MyModel. Mudar para from myapp.models import MyModelcorrigiu o problema.
monkut
@monkut mesmo aqui. Eu me pergunto por que isso está acontecendo. A propósito, eu uso a pasta de aplicativos personalizados. "/ apps" na raiz do projeto, adicionado ao caminho.
4

Depois de continuar encontrando esse problema e sempre voltando a essa pergunta, pensei em compartilhar qual era o meu problema.

Tudo o que @Xeberdee está correto, então siga e veja se isso resolve o problema, se não era esse o meu problema:

No meu apps.py isto é o que eu tinha:

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

E tudo o que fiz foi adicionar o nome do projeto na frente do nome do meu aplicativo assim:

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

e isso resolveu meu problema e eu fui capaz de executar o comando makemigrations e migrate depois disso! boa sorte

ZaMy
fonte
3

Tive este erro hoje ao tentar executar testes do Django porque estava usando a from .models import *sintaxe abreviada em um dos meus arquivos. O problema era que eu tinha uma estrutura de arquivo assim:

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

e models/__init__.pyestava importando meus modelos usando a sintaxe abreviada:

    from .foo import *
    from .bar import *

No meu aplicativo, importava modelos assim:

    from myapp.models import Foo, Bar

Isso causou o Django model doesn't declare an explicit app_labelquando em execução ./manage.py test.

Para corrigir o problema, tive que importar explicitamente do caminho completo em models/__init__.py:

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

Isso resolveu o erro.

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

inostia
fonte
Esse foi o problema para mim também. Obrigado!
Sam Creamer
3

No meu caso, isso estava acontecendo porque eu usei um caminho de módulo relativo em urls.py no nível do projeto , INSTALLED_APPSe em apps.pyvez de ter o root na raiz do projeto. isto é, caminhos de módulo absolutos por toda parte, em vez de caminhos de módulos relativos + hacks.

Não importa o quanto eu errei com os caminhos em INSTALLED_APPSe apps.pyem meu aplicativo, eu não poderia obter tanto runservere pytestao trabalho até que todos os três daqueles foram enraizado na raiz do projeto.

Estrutura da pasta:

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

Com o seguinte, eu poderia executar manage.py runservere gunicorn com wsgi e usar portalvisualizações de aplicativos sem problemas, mas pytest apresentaria um erro ModuleNotFoundError: No module named 'apps'apesar de DJANGO_SETTINGS_MODULEestar configurado corretamente.

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')),
    ...
]

Alterar a referência do aplicativo em config / settings.py para biz_portal.apps.portal.apps.PortalConfige PortalConfig.namepara biz_portal.apps.portalpermitir a execução de pytest (não tenho testes para portalvisualizações ainda), mas runserverhaveria erro com

RuntimeError: Classe de modelo apps.portal.models.Business não declara um app_label explícito e não está em um aplicativo em INSTALLED_APPS

Finalmente, tentei apps.portalver o que ainda estava usando um caminho relativo e descobri que config / urls.py também deveria usar biz_portal.apps.portal.urls.

Jbothma
fonte
Hacks com caminho relativo ......... Fiz o mesmo. Seus insights me ajudaram muito
zar3bski
2

Encontrei este erro quando tentei gerar migrações para um único aplicativo que tinha migrações malformadas existentes devido a uma fusão git. por exemplo

manage.py makemigrations myapp

Quando excluí suas migrações e executei:

manage.py makemigrations

o erro não ocorreu e as migrações geradas com sucesso.

Cerin
fonte
Obrigado. As migrações continuam sendo frustrantes.
HashRocketSyntax
2

Eu tive um problema semelhante, mas fui capaz de resolver o meu especificando explicitamente o app_label usando Meta Class em minha classe de modelos

class Meta:
    app_label  = 'name_of_my_app'
Benjamin Andoh
fonte
Obrigado Benjamin! No meu projeto Django, estou usando o Sphinx para gerar documentação, e a diretiva :: autoclass estava dando o erro "app_label" até que eu adicionei à classe Meta do Model como você sugeriu.
Stefan Musarra
Estou feliz que funcionou para você
Benjamin Andoh
1

Recebi este erro ao tentar atualizar meu aplicativo Django Rest Framework para DRF 3.6.3 e Django 1.11.1.

Para qualquer outra pessoa nessa situação, encontrei minha solução em um problema do GitHub , que era cancelar a UNAUTHENTICATED_USERdefinição das configurações do DRF :

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

Eu apenas encontrei esse problema e descobri o que estava errado. Uma vez que nenhuma resposta anterior descreveu o problema como aconteceu comigo, pensei que poderia publicá-lo para outras pessoas:

  • o problema veio de usar python migrate.py startapp myAppda pasta raiz do meu projeto e mover myApp para uma pasta filha com mv myApp myFolderWithApps/.
  • Eu escrevi myApp.models e executei python migrate.py makemigrations. Tudo correu bem.
  • em seguida, fiz o mesmo com outro aplicativo que estava importando modelos do myApp. Kaboom! Eu encontrei este erro, enquanto realizava migrações. Isso aconteceu porque eu tive que usar myFolderWithApps.myApppara fazer referência ao meu aplicativo, mas tinha esquecido de atualizar MyApp / apps.py. Então eu corrigi myApp / apps.py, settings / INSTALLED_APPS e meu caminho de importação no meu segundo aplicativo.
  • mas aí o erro continuou acontecendo: o motivo era que eu tinha migrações tentando importar os modelos do myApp com o caminho errado. Tentei corrigir o arquivo de migração, mas cheguei a um ponto em que era mais fácil redefinir o banco de dados e excluir as migrações para começar do zero.

Então, para encurtar a história: - o problema vinha inicialmente do nome do aplicativo errado em apps.py de myApp, nas configurações e no caminho de importação do meu segundo aplicativo. - mas não foi suficiente corrigir os caminhos nesses três lugares, pois as migrações foram criadas com importações referenciando o nome do aplicativo errado. Portanto, o mesmo erro continuou acontecendo durante a migração (exceto neste momento de migrações).

Então ... verifique suas migrações e boa sorte!

Harrouet
fonte
1

Recebi um erro semelhante ao construir uma API no Django rest_framework.

RuntimeError: A classe de modelo apps.core.models.University não declara um app_label explícito e não está em uma aplicação no INSTALLED_APPS.

a resposta de luke_aus me ajudou corrigindo meu urls.py

de

from project.apps.views import SurgeryView

para

from apps.views import SurgeryView
Jade Dhangwattanotai
fonte
Para mim, eu o escondi em uma migração. Não tenho certeza de como isso aconteceu, mas remover o nome / caminho do projeto corrigiu as coisas.
Michael Thompson de
1

No meu caso, recebi este erro ao portar o código do Django 1.11.11 para o Django 2.2. Eu estava definindo uma classe derivada de FileSystemStorage personalizada. No Django 1.11.11, eu tinha a seguinte linha em models.py:

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

e mais tarde no arquivo eu tinha a definição da classe:

class MyFileStorage(FileSystemStorage):

No entanto, no Django 2.2, preciso referenciar explicitamente a FileSystemStorageclasse ao importar:

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

e voilà !, o erro desaparece.

Observe que todos estão relatando a última parte da mensagem de erro lançada pelo servidor Django. Porém, se você rolar para cima, encontrará o motivo no meio desse erro mambo-jambo.

user2641103
fonte
1

no meu caso eu consegui encontrar uma correção e olhando para o código de todos os outros pode ser o mesmo problema .. Eu simplesmente tive que adicionar 'django.contrib.sites' à lista de aplicativos instalados no settings.py Arquivo.

espero que isso ajude alguém. esta é minha primeira contribuição para a comunidade de codificação

Jermaine Haughton
fonte
1

TL; DR: Adicionando um __init__.py em branco corrigiu o problema para mim.

Recebi este erro no PyCharm e percebi que meu arquivo de configurações não estava sendo importado. Não houve nenhum erro óbvio ao me dizer isso, mas quando coloquei um código sem sentido no settings.py, não ocorreu um erro.

Eu tinha settings.py dentro de uma pasta local_settings . No entanto, eu não tentei incluir um __init__.py na mesma pasta para permitir que ele seja importado. Depois de adicionar isso, o erro foi embora.

James Bradbury
fonte
1

Se você acertou toda a configuração, pode ser apenas uma bagunça de importação. fique de olho em como você está importando o modelo ofensivo.

O seguinte não funcionará from .models import Business. Em vez disso, use o caminho de importação completo:from myapp.models import Business

evanxg852000
fonte
1

Se tudo mais falhar, e se você estiver vendo este erro ao tentar importar em um "console Python" PyCharm (ou "console Django"):

Tente reiniciar o console.

Isso é muito embaraçoso, mas demorei um pouco para perceber que havia esquecido de fazer isso.

Eis o que aconteceu:

Adicionou um novo aplicativo, adicionou um modelo mínimo e tentou importar o modelo no console Python / Django (PyCharm pro 2019.2). Isso gerou o doesn't declare an explicit app_labelerro, porque eu não adicionei o novo aplicativo ao INSTALLED_APPS. Então, adicionei o aplicativo aoINSTALLED_APPS , tentei importar novamente, mas ainda obtive o mesmo erro.

Vim aqui, leia todas as outras respostas, mas nada parecia se encaixar.

Por fim, percebi que ainda não havia reiniciado o console Python após adicionar o novo aplicativo ao INSTALLED_APPS.

Nota: deixar de reiniciar o console PyCharm Python, depois de adicionar um novo objeto a um módulo, também é uma ótima maneira de obter uma ImportError: Cannot import name ...

djvg
fonte
Obrigado por essa resposta, esqueci de fornecer meu .envarquivo e estava fazendo o possível para fazer as coisas funcionarem com uma configuração obsoleta: /
sodimel
1

O ... M ... G Eu estava recebendo esse erro também e passei quase 2 dias nele e agora finalmente consegui resolver. Sinceramente ... o erro não teve nada a ver com qual era o problema. No meu caso, foi uma simples questão de sintaxe. Eu estava tentando executar um módulo python autônomo que usava alguns modelos django em um contexto django, mas o módulo em si não era um modelo django. Mas eu estava declarando a classe errada

ao invés de ter

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

eu estava fazendo

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

o que está obviamente errado. A mensagem é tão enganosa que não pude evitar, mas pensei que era algum problema com a configuração ou apenas usando o django de forma errada, já que sou muito novo nele.

Vou compartilhar isso aqui para alguém novato, pois eu, passando pela mesma tolice, posso resolver o problema.

Rafael santos
fonte
0

Recebi este erro depois de mover o SECRET_KEYpara extrair de uma variável de ambiente e esqueci de defini-lo ao executar o aplicativo. Se você tem algo assim em seusettings.py

SECRET_KEY = os.getenv('SECRET_KEY')

em seguida, certifique-se de que está definindo a variável de ambiente.

ameier38
fonte
0

Muito provavelmente você tem importações dependentes .

No meu caso, usei uma classe de serializador como um parâmetro em meu modelo, e a classe de serializador estava usando este modelo: serializer_class = AccountSerializer

from ..api.serializers import AccountSerializer

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

E no arquivo "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
fonte
0

Recebi este erro hoje e acabei aqui depois de pesquisar no Google. Nenhuma das respostas existentes parece relevante para minha situação. A única coisa que precisei fazer foi importar um modelo do meu __init__.pyarquivo no nível superior de um aplicativo. Tive que mover minhas importações para as funções usando o modelo.

Django parece ter algum código estranho que pode falhar assim em muitos cenários diferentes!

encaixotado
fonte
0

Eu tenho esse erro também hoje. A mensagem referenciada a algum aplicativo específico de meus aplicativos no INSTALLED_APPS . Mas, na verdade, não tinha nada a ver com este aplicativo específico. Usei um novo Ambiente virtual e esqueci de instalar algumas Bibliotecas, que usei neste projeto. Depois de instalar as bibliotecas adicionais, funcionou.

black_hole_sun
fonte
0

Para usuários do PyCharm: Ocorreu um erro ao usar a estrutura do projeto não "limpa".

Foi:

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

Agora:

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

Aqui estão muitas soluções boas, mas eu acho que, antes de tudo, você deve limpar a estrutura do seu projeto ou ajustar as configurações do PyCharm Django antes de definir DJANGO_SETTINGS_MODULE variáveis ​​e assim por diante.

Espero que ajude alguém. Felicidades.

Pavel Druzhinin
fonte
-1

O problema é que:

  1. Você fez modificações em seu arquivo de modelos, mas não os adicionou ainda ao banco de dados, mas está tentando executar Python manage.py runserver.

  2. Execute Python manage.py makemigrations

  3. Python manage.py migrate

  4. Agora Python manage.py runserver e tudo deve ficar bem.

Ken Edem
fonte