Django 1.9 предупреждения об устаревании ярлык приложения



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



/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:6: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Difficulty doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Difficulty(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:21: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Zone doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Zone(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:49: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Boss doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Boss(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:79: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Item doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Item(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:14: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Category doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Category(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:36: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Comment doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Comment(ScoreMixin, ProfileMixin, models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:64: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Forum doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Forum(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:88: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Post doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Post(ScoreMixin, ProfileMixin, models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:119: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.CommentPoint doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class CommentPoint(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:127: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.TopicPoint doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class TopicPoint(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/auctionhouse/models.py:10: RemovedInDjango19Warning: Model class ankylosguild.apps.auctionhouse.models.Auction doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Auction(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/auctionhouse/models.py:83: RemovedInDjango19Warning: Model class ankylosguild.apps.auctionhouse.models.Bid doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Bid(models.Model):


теперь это ставит 3 вопроса для меня.




  1. по словам документация,Options.app_label не является обязательным требованием, если модель не находится за пределами модуля приложения, во-вторых, это поведение было осуждено в 1.7 в любом случае, так почему это даже проблема?

  2. все приложения находятся в кортеже INSTALLED_APPS, так что это, конечно, не может быть так?

  3. почему приложения не загружаются до их вызова, если все находится в кортеже INSTALLED_APPS?


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

752   12  

12 ответов:

как указано в предупреждении, это происходит либо:

  • когда вы используете модель, которая не находится в INSTALLED_APPS;
  • или когда вы используете модель до загрузки ее приложения.

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

как правило, это происходит, когда у вас есть from .models import SomeModels вapps.py ранний сигнал (например post_migrate). Вместо того, чтобы ссылаться на свои модели классическим способом здесь, рекомендуется использовать AppConfig.get_model (). Проверьте ваш apps.py файл для любого импорта модели, и заменить их с помощью этого api.

например, вместо :

# apps.py

from django.apps import AppConfig
from .models import MyModel

def do_stuff(sender, **kwargs):
    MyModel.objects.get() # etc...

class MyAppConfig(AppConfig):
    name = 'src.my_app_label'

    def ready(self):
        post_migrate.connect(do_stuff, sender=self)

этого :

# apps.py

from django.apps import AppConfig

def do_stuff(sender, **kwargs):
    mymodel = sender.get_model('MyModel')
    mymodel.objects.get() # etc...

class MyAppConfig(AppConfig):
    name = 'src.my_app_label'

    def ready(self):
        post_migrate.connect(do_stuff, sender=self)

обратите внимание, что это исполнение было введено в bug #21719.

аналогичная ошибка. В моем случае ошибка была:

RemovedInDjango19Warning: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Site(models.Model):

мое решение было:

добавил 'django.contrib.sites' to INSTALLED_APPS

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

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

/home/mark/mystupiddjangoproject/alerts/models.py:15: RemovedInDjango19Warning: Model class mystupiddjangoproject.alerts.models.Alert doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Alert(models.Model):

... включено имя каталога, в котором находится проект (mystupiddjangoproject) в полном имени модели, которое должно было быть:alerts.models.Alert.

чтобы исправить это, мне просто нужно было сделать:

rm __init__.py
rm __init__.pyc

я получал аналогичную ошибку, но вместо того, чтобы жаловаться на модели в моих приложениях, он жаловался на модели в contrib пакеты. Например:

C:\Program файлы\Python 2.7\lib\site-packages\django\contrib\sessions\models.py:27: RemovedInDjango19Warning: класс модели django.ВНО.проведение сессий.модели.Сеанс не объявляет явную метку app_label и либо не находится в приложении в INSTALLED_APPS, либо был импортирован до его применения нагруженный. Этого больше не будет поддерживаться в Django 1.9. класс сессии (модели.Модель):

это вызвано плохим порядком в INSTALLED_APPS в собственность settings.py. Мой settings.py изначально содержала:

INSTALLED_APPS = (
    'my_app_1',
    'my_app_2',
    'my_app_3',
    'bootstrap_admin',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.messages',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'social.apps.django_app.default',
    'mathfilters',
    'rest_framework',
)

my_app_* используйте модели из contrib пакеты. Ошибка вызвана использованием моделей перед их объявлением (т. е. Django должен знать о приложениях, содержащих эти модели до через них).

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

INSTALLED_APPS = (
    'bootstrap_admin',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.messages',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'social.apps.django_app.default',
    'mathfilters',
    'rest_framework',
    'my_app_1',
    'my_app_2',
    'my_app_3',
)

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

, я считаю, что подобные ситуация вызывает вашу проблему:

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

добавьте мета-класс В модель с атрибутом app_label.

class Meta:
    app_label = 'app_model_belongs_to'

надеюсь, что это работает!

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

для получения дополнительной информации обратитесь к: https://docs.djangoproject.com/en/1.8/ref/models/options/#app-label

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

как вы можете теперь, это довольно часто, чтобы иметь круговые проблемы импорта между сигналами и моделями, и это обычно, чтобы импортировать их из приложения __init__.py файл или из нижней части чтобы избежать их.

Ну, я использовал __init__.py подход, а просто перемещение import signals заявление в нижней части моего models.py файл решил проблему.

надеюсь, это поможет кому-то еще!

У меня была та же проблема. Я поставил точку останова в django.db.models.base.py:line82 и пытаюсь выяснить, что вызывает это предупреждающее сообщение.

# Look for an application configuration to attach the model to.
app_config = apps.get_containing_app_config(module)

в принципе, если ваше приложение не существует к этому времени, вы получите это предупреждение. Я понял, что моя проблема заключалась в том, что у меня есть сторонний фреймворк (в моем случае, haystack), который пытается импортировать одну из моих пользовательских моделей.

возможно, у вас также есть сторонний пакет, указанный в INSTALLED_APPS перед вашими пользовательскими приложениями и ваш сторонний пакет ссылается на ваши пользовательские приложения? Это было бы возможно, если вы используете что-то вроде Django Rest framework, а также.

способ Django 1.9 справиться с этим и дать вашему приложению хорошее имя в Администраторе, чтобы сделать следующее:

добавьте файл в свое приложение с именем apps.py и добавьте к нему следующий код:

#apps.py
from django.apps import AppConfig


class YourAppNameAppConfig(AppConfig):
    name = 'yourappname'
    verbose_name = 'Your App Name Looking Right'

затем, в вашем приложении __init__.py файл, добавьте следующее:

#__init__.py    
default_app_config = 'youappname.apps.YourAppNameAppConfig'

У меня есть эта проблема после обновления Django с 1.8 до 1.9.1:

RuntimeError at /

блог класса модели.модели.BlogCategory не объявляет явный app_label и не находится в приложении в INSTALLED_APPS.

Это поможет решить:

in blog/models.py:

class BlogCategory(models.Model):
    some vars & methods

    class Meta:
        app_label = 'BlogCategory'

это работа на 100%.

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

Я удалил все .pyc, чтобы обновить все из них, используя этот bash

find . -name "*.pyc" -exec rm -rf {} \;

самый простой и простой способ решить эту проблему-поместить команду "import signals" в нижней части файла модели, с которым вы работаете. Это гарантирует, что все модели будут загружены до импорта сигналов для этой модели. Вам нужно будет сделать это для каждой импортируемой модели (если вы используете приемники, связанные с определенными моделями), или в models.py для приложения, которое приходит в конце "установленных приложений" в настройках.

другие решения только требуется, если вы имеете дело с сигналами немодельного типа, где модели никогда не будут импортированы в первую очередь.

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

models.py

from django.db import models

class MyModel(models.Model):
    myfield1 = models.CharField()
    myfield2 = models.CharField()

import signals

а затем в signals.py:

from django.db.models.signals import pre_save # Or whatever you are using
from django.dispatch import receiver

from .models import MyModel

@receiver(pre_save, sender=MyModel)
def my_receiver(sender, instance, **kwargs):
    mysender = sender
    print mysender

подобное.

Я не получил никаких ошибок в django 1.7. При переходе на django 1.8 я получил эту ошибку. Причина была в том, что сигнал был определен в app/signal_receiver.py.

Я создал apps.py

from django.apps import AppConfig

class TasksConfig(AppConfig):
    name = 'core'
    verbose_name = "core"

    def ready(self):
        import core.signal.handler

я переместил приемник сигнала в handler.py внутри пакета сигнала.

Comments

    Ничего не найдено.