Модель Django «не объявляет явную app_label»


119

Я на грани остроумия. После десятка часов поиска и устранения неисправностей, а может, и больше, я подумал, что наконец-то в деле, но потом я получил:

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

В Интернете ТАК МАЛЕНЬКАЯ информация об этом, и никакое решение не решило мою проблему. Любой совет будет чрезвычайно признателен.

Я использую Python 3.4 и Django 1.10.

Из моего 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',
]

И мои файлы apps.py выглядят так:

from django.apps import AppConfig


class DeletenoteConfig(AppConfig):
    name = 'DeleteNote'

и

from django.apps import AppConfig


class LibrarysyncConfig(AppConfig):
    name = 'LibrarySync'

2
У вас нет django.contrib.contenttypes в INSTALLED_APPS.
RemcoGerlich

2
Другая вероятная причина заключается в том, что вы импортировали его до того, как были загружены его модели, использует ли его какое-то приложение, указанное перед типами содержимого в INSTALLED_APPS?
RemcoGerlich

1
Это необычно, у вас вообще нет собственного проекта или приложения?
RemcoGerlich

1
Все, что имеет models.py, должно быть в INSTALLED_APPS; и если один из них использует тип содержимого (скажем, из-за общего внешнего ключа), то он должен находиться в списке типов содержимого.
RemcoGerlich

1
К сожалению, это будет что-то очень маленькое, но отсюда сложно сказать, где именно. Вы импортируете что-нибудь из своего материала в settings.py или около того?
RemcoGerlich

Ответы:


91

Вам не хватает имени вашего приложения в файле настроек? Это myAppNameConfigкласс по умолчанию, созданный в apps.py командой .manage.py createapp myAppName . Где myAppName - это имя вашего приложения.

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

Таким образом, файл настроек узнает, что вы хотите назвать своим приложением. Вы можете изменить его внешний вид позже в файле apps.py, добавив следующий код в

myAppName / apps.py

class myAppNameConfig(AppConfig):
    name = 'myAppName'
    verbose_name = 'A Much Better Name'

Хорошо, так что это имеет для меня большой смысл с примером, и я внес изменения теперь, основываясь на моем понимании синтаксиса, но я все еще нахожусь на 100% той же ошибки. Я обновил свой пост, чтобы уточнить.
Slbox

3
Спасибо @xeberdee и @RemcoGerlich за их помощь в этом. В конце концов, моим решением было загрузить мои приложения под приложениями django.contrib и переместить мою запись import django django.setup()в моем settings.py под INSTALLED_APPSзапись.
Slbox

2
Просто из любопытства - зачем импортировать django django.setup () в файл настроек? Кроме того, ваши приложения должны загружаться, даже если они первые в списке установленных приложений.
Xeberdee

1
В чем разница между этим и тем, что он написал в своем вопросе?
Matt D

1
Дело в том, как приложение обнаруживается в настройках INSTALLED_APPS через поле имени класса в файле конфигурации. Сообщение отредактировано.
Xeberdee

36

Я получаю ту же ошибку и не знаю, как решить эту проблему. Мне потребовалось много часов, чтобы заметить, что у меня есть init.py в том же каталоге, что и manage.py из django.

Перед:

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

После:

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

Это довольно сбивает с толку, что вы получаете эту ошибку «не объявляет явную app_label». Но удаление этого файла инициализации решило мою проблему.


2
Черт возьми, я так долго на это смотрел - отличный улов!
user3167654,

Я пытаюсь создать документацию с помощью pydoc, и мое приложение скрыто без init.py
Серг

20

У меня была точно такая же ошибка при запуске тестов с PyCharm. Я исправил это, явно установив DJANGO_SETTINGS_MODULEпеременную окружения. Если вы используете PyCharm, просто нажмите кнопку « Изменить конфигурации» и выберите « Переменные среды» .

Установите для переменной значение, your_project_name.settingsи это должно исправить ситуацию.

Похоже, эта ошибка возникает из-за того, что PyCharm запускает собственные тесты manage.py.


1
Если бы эта проблема запускала тесты Pycharm, хотя запуск сервера через Pycharm не требовал от меня добавления настроек. Ручное добавление DJANGO_SETTINGS_MODULE в конфигурацию для теста решено, если для меня.
PhoebeB

1
Также при редактировании конфигураций полезно редактировать шаблоны.
Yngve Høiseth

1
Настройки -> Языки и рамки -> Django -> Добавление значения в настройках будет автоматически устанавливаться DJANGO_SETTINGS_MODULEдля каждой новой конфигурации тестового запуска Django и Django.
Тобиас Эрнст

К вашему сведению, я сделал именно то, что указано в этом решении, и это не сработало с первого раза. Оказывается, PyCharm не сохранял DJANGO_SETTINGS_MODULEв первый раз, когда я Applyтогда щелкнул OK. Сделал второй раз и теперь работает. Похоже на немного странностей PyCharm.
MikeyE

Я должен был убедиться, что я правильно объявил импорт: from <app>.<module> import <class>- автоматический импорт PyCharm отсутствовал <app>. Как только я исправил это (также проверил зависимые модули), все заработало нормально.
Мэтью Хегарти,

18

Я получил это, когда использовал, ./manage.py shell затем я случайно импортировал из корневого каталога уровня проекта

# 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()

в моем случае мне пришлось изменить с from fields import xнаfrom .fields import x
daigorocub

13

как новичок , использующий Python3 , я считаю, что это может быть ошибка импорта, а не ошибка Django

неправильно:

from someModule import someClass

право:

from .someModule import someClass

это произошло несколько дней назад, но я действительно не могу это воспроизвести ... Я думаю, что с этим могут столкнуться только люди, плохо знакомые с Django. вот что я помню:

попробуйте зарегистрировать модель в admin.py:

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

попробуйте запустить сервер, ошибка выглядит так

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

изменить userна .user, проблема решена


9
Добро пожаловать в stackoverflow! Я считаю своим долгом упомянуть, что ваш ответ не имеет отношения к вопросу ОП. Как новичок, вы должны быть осторожны, предлагая решения, не проверяя их правильность. Но, пожалуйста, продолжайте возвращаться и публикуйте конкретные ответы, когда сможете - спасибо!
evadeflow 06

1
Я бы хотел, чтобы больше комментариев к Стэку были похожи на ваши, Ксеон Фил. Слишком часто новых пользователей прогоняют бешеные комментаторы, недовольные тем, что они не являются экспертами по Stack в первый же день.
Slbox 09

1
Вы правы, @evadeflow, мой первый ответ выглядит совершенно не связанным, я пытаюсь уточнить ответ. В любом случае, просто надеюсь, что ответ может быть полезен.
rpstw

В моем случае была похожая проблема. 'from ..core.models import CommonInfo' должно было стать 'from apps.core.models import CommonInfo'
user42488

Это была моя проблема, скрытая, потому что она происходила в двух отдельных файлах. Блин, вложенный импорт! Черт возьми, мой глупый отказ от разумных изменений 2to3!
9999years

13

Только что у меня была такая же проблема. Я исправил свое, добавив пространство имен в имя приложения. Надеюсь, кто-то сочтет это полезным.

apps.py

from django.apps import AppConfig    

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

8

Я получил эту ошибку при импорте моделей в тесты, т.е. с учетом этой структуры проекта Django:

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

в файле, который test_models.pyя импортировал MyModelтаким образом:

from models import MyModel

Проблема была исправлена, если он был импортирован таким образом:

from myapp.models import MyModel

Надеюсь это поможет!

PS: Возможно, это немного поздно, но я не нашел в других ответах, как решить эту проблему в моем коде, и я хочу поделиться своим решением.


juliocesar, ты чемпион. Спасибо. Это была нелепая ошибка.
Кирк

2
Мне потребовалось больше времени, чем ожидалось, чтобы найти это. Я использовал относительный импорт в моем файле test.py. Получил ошибку при использовании from .models import MyModel. Переход на from myapp.models import MyModelустраненную проблему.
монкут

@monkut и здесь. Интересно, почему это происходит? Кстати, я использую папку с пользовательскими приложениями. "/ apps" в корне проекта, добавленный в путь.

4

Продолжая сталкиваться с этой проблемой и возвращаться к этому вопросу, я подумал, что расскажу, в чем была моя проблема.

Все, что @Xeberdee правильно, так что следуйте этому и посмотрите, решит ли это проблему, если бы не это была моя проблема:

В моем apps.py было вот что:

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

И все, что я сделал, это добавил имя проекта перед именем моего приложения следующим образом:

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

и это решило мою проблему, и после этого я смог запустить команду makemigrations и migrate! удачи


3

У меня была эта ошибка сегодня при попытке запустить тесты Django, потому что я использовал сокращенный from .models import *синтаксис в одном из моих файлов. Проблема заключалась в том, что у меня была такая файловая структура:

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

и в models/__init__.pyя импортировал свои модели, используя сокращенный синтаксис:

    from .foo import *
    from .bar import *

В моем приложении я импортировал такие модели:

    from myapp.models import Foo, Bar

Это вызвало Django model doesn't declare an explicit app_labelпри запуске ./manage.py test.

Чтобы решить эту проблему, мне пришлось явно импортировать из полного пути в models/__init__.py:

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

Это устранило ошибку.

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


Это было проблемой и для меня. Спасибо!
Сэм Кример,

3

В моем случае это произошло потому, что я использовал относительный путь к модулю в urls.py на уровне проекта , INSTALLED_APPSа apps.pyне в корне проекта. т.е. абсолютные пути к модулям во всем, а не относительные пути модулей + хаки.

Независимо от того, насколько я испортил пути в своем приложении INSTALLED_APPSи apps.pyв моем приложении, я не мог получить оба runserverи pytestработать, пока все три из них не были внедрены в корень проекта.

Структура папки:

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

Со следующим, я мог бы запускать manage.py runserverи стрелять с wsgi и использовать представления portalприложений без проблем, но pytest выдает ошибку, ModuleNotFoundError: No module named 'apps'несмотря DJANGO_SETTINGS_MODULEна правильную настройку.

конфиг / settings.py:

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

biz_portal / приложения / портал / apps.py:

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

конфиг / urls.py:

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

Изменение ссылки приложения в конфигурации / settings.py до biz_portal.apps.portal.apps.PortalConfigи PortalConfig.nameв biz_portal.apps.portalразрешенных pytest работать (я не имею тесты для portalвзглядов еще) , но runserverбудет ошибка с

RuntimeError: класс модели apps.portal.models.Business не объявляет явный app_label и не находится в приложении в INSTALLED_APPS

Наконец, я попытался apps.portalувидеть, что по-прежнему использует относительный путь, и обнаружил, что config / urls.py также следует использовать biz_portal.apps.portal.urls.


Хаки с относительным путем ......... Сделал то же самое. Ваше понимание мне очень
помогло

2

Я столкнулся с этой ошибкой, когда пытался создать миграции для одного приложения, которое имело неправильные миграции из-за слияния git. например

manage.py makemigrations myapp

Когда я удалил его миграции, а затем запустил:

manage.py makemigrations

ошибка не произошла, и миграции сгенерированы успешно.


Спасибо. Миграции продолжают вызывать разочарование.
HashRocketSyntax

2

У меня была аналогичная проблема, но я смог решить свою, явно указав app_label с помощью Meta Class в моем классе моделей

class Meta:
    app_label  = 'name_of_my_app'

Спасибо, Бенджамин! В моем проекте Django я использую Sphinx для создания документации, а директива :: autoclass выдавала ошибку app_label, пока я не добавил ее в класс Meta модели, как вы предложили.
Стефан Мусарра,

1

Я получил эту ошибку при попытке обновить приложение Django Rest Framework до DRF 3.6.3 и Django 1.11.1.

Для кого-то еще в этой ситуации я нашел свое решение в проблеме GitHub , которая заключалась в том, чтобы отключить UNAUTHENTICATED_USERпараметр в настройках DRF :

# webapp/settings.py
...
REST_FRAMEWORK = {
    ...
    'UNAUTHENTICATED_USER': None
    ...
}

1

Я просто столкнулся с этой проблемой и понял, что пошло не так. Поскольку ни один из предыдущих ответов не описывал проблему, как это случилось со мной, я бы опубликовал ее для других:

  • проблема возникла из-за использования python migrate.py startapp myAppиз корневой папки моего проекта, а затем переместите myApp в дочернюю папку с помощью mv myApp myFolderWithApps/.
  • Я написал myApp.models и побежал python migrate.py makemigrations. Все прошло хорошо.
  • Затем я сделал то же самое с другим приложением, которое импортировало модели из myApp. Kaboom! Я столкнулся с этой ошибкой при выполнении makemigations. Это произошло потому, что мне пришлось использовать myFolderWithApps.myAppссылку на свое приложение, но я забыл обновить MyApp / apps.py. Поэтому я исправил myApp / apps.py, settings / INSTALLED_APPS и свой путь импорта во втором приложении.
  • но затем ошибка продолжалась: причина была в том, что у меня были миграции, пытающиеся импортировать модели из myApp с неправильным путем. Я попытался исправить файл миграции, но дошел до того момента, когда было проще сбросить БД и удалить миграции, чтобы начать с нуля.

Короче говоря: - проблема изначально возникла из-за неправильного имени приложения в apps.py myApp, в настройках и в пути импорта моего второго приложения. - но этого было недостаточно, чтобы исправить пути в этих трех местах, поскольку миграции были созданы с импортом, ссылающимся на неправильное имя приложения. Таким образом, во время миграции повторялась одна и та же ошибка (за исключением случаев миграции).

Итак ... проверьте свои миграции и удачи!


1

У меня аналогичная ошибка при создании API в Django rest_framework.

RuntimeError: класс модели apps.core.models.University не объявляет явного> app_label и не находится в приложении в INSTALLED_APPS.

Ответ luke_aus помог мне, исправив мой urls.py

из

from project.apps.views import SurgeryView

к

from apps.views import SurgeryView

Для меня это было спрятано в миграции. Не уверен, как это произошло, но удаление имени / пути проекта исправило ситуацию.
Майкл Томпсон

1

В моем случае эта ошибка возникла при переносе кода с Django 1.11.11 на Django 2.2. Я определял собственный производный класс FileSystemStorage. В Django 1.11.11 у меня была следующая строка в models.py:

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

а позже в файле у меня было определение класса:

class MyFileStorage(FileSystemStorage):

Однако в Django 2.2 мне нужно явно ссылаться на FileSystemStorageкласс при импорте:

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

и вуаля !, ошибка исчезнет.

Обратите внимание, что все сообщают последнюю часть сообщения об ошибке, выданного сервером Django. Однако, если вы прокрутите вверх, вы найдете причину в середине этой ошибки mambo-jambo.


1

в моем случае мне удалось найти исправление, и, посмотрев на код всех остальных, это может быть та же проблема .. Мне просто нужно было добавить django.contrib.sites в список установленных приложений в settings.py файл.

надеюсь, это кому-то поможет. это мой первый вклад в сообщество программистов


1

TL; DR: добавление пустого __init__.py проблему для меня.

Я получил эту ошибку в PyCharm и понял, что мой файл настроек вообще не импортируется. При этом не было очевидной ошибки, но когда я поместил какой-то бессмысленный код в settings.py, это не вызвало ошибки.

У меня был settings.py внутри папки local_settings . Однако я бы не стал включать __init__.py в ту же папку, чтобы его можно было импортировать. Как только я добавил это, ошибка исчезла.


1

Если у вас все правильно настроено, это может быть просто беспорядок при импорте. следите за тем, как вы импортируете проблемную модель.

Следующее не сработает from .models import Business. Вместо этого используйте полный путь импорта:from myapp.models import Business


1

Если ничего не помогает и вы видите эту ошибку при попытке импорта в PyCharm «консоль Python» (или «консоль Django»):

Попробуйте перезапустить консоль.

Это довольно неловко, но мне потребовалось время, прежде чем я понял, что забыл это сделать.

Вот что произошло:

Добавил новое приложение, затем добавил минимальную модель, а затем попытался импортировать модель в консоль Python / Django (PyCharm pro 2019.2). Это вызвало doesn't declare an explicit app_labelошибку, потому что я не добавил новое приложение в INSTALLED_APPS. Итак, я добавил приложение вINSTALLED_APPS , снова попытался импортировать, но все равно получил ту же ошибку.

Пришел сюда, прочитал все остальные ответы, но ничего не подошло.

Наконец меня осенило, что я еще не перезапустил консоль Python после добавления нового приложения в INSTALLED_APPS.

Примечание: невозможность перезапустить консоль PyCharm Python после добавления нового объекта в модуль также является отличным способом получить очень запутанный ImportError: Cannot import name ...


Спасибо за этот ответ, я забыл предоставить свой .envфайл и изо всех
сил

1

O ... M ... G Я тоже получал эту ошибку, я потратил на нее почти 2 дня, и теперь мне наконец удалось ее решить. Честно говоря ... ошибка не имела ничего общего с тем, в чем была проблема. В моем случае это был простой синтаксис. Я пытался запустить автономный модуль Python, который использовал некоторые модели django в контексте django, но сам модуль не был моделью django. Но я объявлял класс неправильным

вместо того, чтобы иметь

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

я делал

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

что явно неверно. Сообщение настолько вводит в заблуждение, что я не мог с собой поделать, но подумал, что это какая-то проблема с конфигурацией или просто неправильное использование django, поскольку я очень новичок в этом.

Я поделюсь этим здесь для кого-то новичка, поскольку я, переживая ту же глупость, надеюсь, может решить их проблему.


0

Я получил эту ошибку после того, как переместил SECRET_KEYизвлечение из переменной среды и забыл установить ее при запуске приложения. Если у вас есть что-то подобное в вашемsettings.py

SECRET_KEY = os.getenv('SECRET_KEY')

затем убедитесь, что вы действительно устанавливаете переменную среды.


0

Скорее всего, у вас зависимый импорт .

В моем случае я использовал класс сериализатора в качестве параметра в моей модели, а класс сериализатора использовал эту модель: serializer_class = AccountSerializer

from ..api.serializers import AccountSerializer

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

И в файле "сериализаторов":

from ..models import Account

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

0

Я получил эту ошибку сегодня и оказался здесь после поиска в Google. Ни один из существующих ответов не имеет отношения к моей ситуации. Единственное, что мне нужно было сделать, это импортировать модель из моего __init__.pyфайла на верхнем уровне приложения. Мне пришлось переместить свой импорт в функции, использующие модель.

Кажется, у Django есть какой-то странный код, который может давать сбой во многих разных сценариях!


0

Я получил эту ошибку и сегодня. Сообщение ссылается на какое-то конкретное приложение из моих приложений в INSTALLED_APPS . Но на самом деле это не имело ничего общего с этим конкретным приложением. Я использовал новую виртуальную среду и забыл установить некоторые библиотеки, которые я использовал в этом проекте. После того, как я установил дополнительные библиотеки, все заработало.


0

Для пользователей PyCharm: у меня была ошибка при использовании не «чистой» структуры проекта.

Был:

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

Сейчас:

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

Вот много хороших решений, но я думаю, прежде всего, вы должны очистить структуру своего проекта или настроить параметры PyCharm Django перед настройкой DJANGO_SETTINGS_MODULE переменных и так далее.

Надеюсь, это кому-то поможет. Ура.


-1

Проблема в том, что:

  1. Вы внесли изменения в свой файл моделей, но еще не добавили их в БД, но вы пытаетесь запустить Python manage.py runserver.

  2. Запустите Python manage.py makemigrations

  3. Python manage.py migrate

  4. Теперь Python manage.py runserver, и все должно быть в порядке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.