Модель Django "не оголошує явного_прикладу"


119

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

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

В Інтернеті є так мало інформації про це, і жодне рішення там не вирішило мою проблему. Будь-яка порада буде дуже вдячна.

Я використовую Python 3.4 та Django 1.10.

З мого налаштування.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.content in INSTALLED_APPS.
RemcoGerlich

2
Тоді інша вірогідна річ, що ви імпортували її до завантаження її моделей, це якась програма, яка перерахована до типів контенту в INSTALLED_APPS, використовуючи її?
RemcoGerlich

1
Це незвично, у вас взагалі немає власного проекту чи програми?
RemcoGerlich

1
Все, що має model.py, має бути в INSTALLED_APPS; і якщо один з них використовує contenttype (через загальний зовнішній ключ, скажімо), він повинен бути під типами content в списку.
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

2
Дякуємо @xeberdee та @RemcoGerlich за допомогу в цьому. Врешті-решт моїм рішенням було завантажити мої додатки нижче програм django.contrib і перемістити запис import django django.setup()у моїх налаштуваннях.py під INSTALLED_APPSзапис.
Slbox

2
Просто з цікавості - навіщо імпортувати django django.setup () у файл налаштувань? Також ваші програми повинні завантажуватися, навіть якщо вони є першими у списку встановлених програм.
Xeberdee

1
Яка різниця між цим і тим, що він написав у своєму питанні?
Метт Д

1
Справа полягала в тому, як додаток виявляється в налаштуваннях INSTALLED_APPS через поле імені класу в конфігураційному файлі. Повідомлення відредаговано.
Xeberdee

36

Я отримую ту саму помилку, і я не знаю, як розібратися в цій проблемі. Мені знадобилося багато годин, щоб помітити, що у мене є init.py в тому ж самому напрямку, що і dvd.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" помилки. Але видалення цього файлу init вирішило мою проблему.


2
Святий курить, я так довго дивився на це - чудовий улов!
користувач3167654

Я намагаюся створити документацію за допомогою pydoc, і моє додаток приховано без init.py
Serg

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.
Тобіас Ернст

FYI, я зробив саме так, як вказано цим рішенням, і це не спрацювало з першого разу. Виявляється, PyCharm не врятував DJANGO_SETTINGS_MODULEперший раз, коли я натиснув Applyтоді OK. Я це зробив вдруге і зараз це працює. Здається, трохи дивацтва PyCharm.
MikeyE

Я повинен був переконатися, що я декларував імпорт правильно: з <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

як noob, що використовує Python3 , я вважаю, що це може бути помилка імпорту замість помилки Django

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

from someModule import someClass

правильно:

from .someModule import someClass

це трапляється кілька днів тому, але я справді не можу це відтворити ... Я думаю, що лише нові люди, що знаходяться у Джанго, можуть зіткнутися з цим.

спробуйте зареєструвати модель в 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! Я змушений зазначити, що ваша відповідь не пов'язана з питанням ОП. Як нобі, вам слід бути обережними, пропонуючи рішення, не попередньо перевіряючи їх правильність. Але, будь ласка, продовжуйте повертатися та публікуйте конкретні відповіді, коли зможете - дякую!
ухилення від потоку

1
Мені б хотілося, щоб більше коментарів щодо Stack були як твій Ксеон Філ. Занадто часто нових користувачів відганяють шалені коментатори, незадоволені тим, що вони не є експертами зі стека в перший день.
Slbox

1
Ви маєте рацію, @evadeflow, моя перша відповідь виглядає насправді не пов’язаною, я намагаюся уточнити відповідь. У будь-якому випадку, просто сподіваюся, що відповідь може бути корисною.
rpstw

У моєму випадку це було подібне питання. 'from ..core.models import CommonInfo' повинен був стати 'з apps.core.models import CommonInfo'
user42488

Це було моєю проблемою, прихованою, оскільки це відбувалося у двох окремих файлах. Опасуємо вас, вкладете імпорт! Опасуємо вас, моє нерозумне відхилення розумних змін 2to3!
9999років

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

@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

Сьогодні у мене була ця помилка при спробі запустити тести Джанго, оскільки я використовував скорочений 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те, що він налаштований правильно.

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

Зміна посилання додатки в конфігурації / 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 для створення документації, а директива :: автокласу давала помилку "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. Кабум! Я зіткнувся з цією помилкою, виконуючи макеміграції. Це було тому, що мені довелося використовувати myFolderWithApps.myAppпосилання на свій додаток, але я забув оновити MyApp / apps.py. Тому я виправив myApp / apps.py, налаштування / 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

і voilà !, помилка зникає.

Зауважте, що всі повідомляють про останню частину повідомлення про помилку, виплюнене сервером 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файл, і я робив усе можливе, щоб справи працювали із застарілою конфігурацією: /
sodimel

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

Я отримав цю помилку сьогодні і опинився тут після гуглінгу. Жодна з існуючих відповідей не здається актуальною для моєї ситуації. Єдине, що мені потрібно було зробити, це імпортувати модель з мого __init__.pyфайлу у верхньому рівні програми. Мені довелося перенести імпорт у функції за допомогою моделі.

Здається, у Джанго є якийсь дивний код, який може вийти з ладу у багатьох ситуаціях!


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 Manag.py runserver.

  2. Запустіть Python manag.py макеміграції

  3. Python Manag.py мігрує

  4. Тепер Python Manag.py runserver і все повинно бути добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.