web-dev-qa-db-ja.com

Django 1.9非推奨の警告app_label

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 Tupleに含まれているので、それは確かにできませんか?
  3. すべてがINSTALLED_APPSタプルにある場合、アプリケーションが呼び出される前にアプリケーションがロードされないのはなぜですか?

私が実際に何か間違ったことをしている場合、ドキュメントはこの問題の原因や修正方法を本当に明確にしていないので、それを行う正しい方法は何ですか?.

59
Neil Hickman

警告に記載されているように、これは次のいずれかで発生します。

  • INSTALLED_APPSにないモデルを使用している場合;
  • または、アプリケーションがロードされる前にモデルを使用している場合。

INSTALLED_APPS設定でアプリを参照したため、これはアプリの初期化前にモデルを使用している可能性が高いです。

通常、これは、apps.py早期信号にfrom .models import SomeModelsがある場合に発生します(たとえば、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)

この強制はバグ #21719 で導入されたことに注意してください。

50
Antwan

同様のエラー。私の場合、エラーは次のとおりです。

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'INSTALLED_APPSを追加しました

50
WayBehind

私と同じことが原因でこのエラーが発生するのは、ごく少数の人々にすぎないと思われますが、他の人に役立つ場合は、この回答を追加する価値があるようです!

ある時点でテストを実行すると、これらのエラーの多くが突然見られました。Djangoプロジェクトの最上位で__init__.pyを誤って作成したことが判明しました。サブディレクトリ。これが起こっていた手がかりは、次のようなエラーです。

/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
23
Mark Longair

同様のエラーが発生していましたが、アプリのモデルについて文句を言うのではなく、contribパッケージのモデルについて文句を言っていました。例えば:

C:\ Program Files\Python 2.7\lib\site-packages\Django\contrib\sessions\models.py:27:RemovedInDjango19Warning:モデルクラスDjango.contrib.sessions.models.Sessionは明示的なapp_labelを宣言せず、どちらも'tがINSTALLED_APPSのアプリケーションに含まれていないか、アプリケーションがロードされる前にインポートされました。これはDjango 1.9ではサポートされなくなります。クラスSession(models.Model):

これは、INSTALLED_APPSsettings.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は、それらのモデルを含むアプリについて知っている必要がありますbefore使用)。

これを解決するには、アプリが宣言される順序を変更する必要があります。具体的には、すべての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',
)

これはあなたの質問に直接答えないかもしれませんが、関連する質問に答えます。これはエラーを貼り付けるときにGoogleに表示されるSOリンクのみであるため、ここで答えました。

ただし、同様の状況が問題を引き起こしていると思います:

「依存関係」アプリを使用するアプリの前に必ず宣言してください!エラーは実際にどのアプリがモデルを使用しているかを指定するものではないため、言及するモデルを含むアプリをプッシュする必要がありますエラーが消えるまで、上部から1つずつ。

10

App_label属性を使用して、モデルにメタクラスを追加します。

class Meta:
    app_label = 'app_model_belongs_to'

これがうまくいくことを願っています!

EDIT:この理由は通常、モデルが標準の場所の外側に存在するためです。

詳細については、以下を参照してください: https://docs.djangoproject.com/en/1.8/ref/models/options/#app-label

8
Justin Ober

Djangoを1.8から1.9.1にアップグレードすると、この問題が発生します。

RuntimeError at /

モデルクラスblog.models.BlogCategoryは明示的なapp_labelを宣言せず、INSTALLED_APPSのアプリケーションにありません。

これは解決するのに役立ちます:

blog/models.py:

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

    class Meta:
        app_label = 'BlogCategory'

100%で機能します。

私もこの問題に直面しましたそれは私がsignals.pyモジュールをロードしていた方法に関連していましたアプリから。

ご存知のように、信号とモデルの間で循環インポートの問題が発生することは非常に一般的であり、通常はそれらを避けるためにアプリの__init__.pyファイルまたはmodels.pyファイルの下部からインポートします。 。

さて、私は__init__.pyアプローチを使用していましたが、ただimport signalsステートメントをmodels.pyファイルの最後に移動すると問題が解決しました

これが他の人の助けになることを願っています!

5
Caumons

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'
4
NathanQ

同じ問題がありました。 Django.db.models.base.py:line82にブレークポイントを設定し、この警告メッセージの原因を突き止めます。

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

基本的に、アプリがこの時間までに存在しない場合、その警告が表示されます。私の問題は、カスタムモデルの1つをインポートしようとするサードパーティのフレームワーク(私の場合はhaystack)があることであることに気付きました。

カスタムアプリとサードパーティのパッケージがカスタムアプリを参照する前に、INSTALLED_APPSにサードパーティのパッケージがリストされている場合もありますか?これは、Django restフレームワークのようなものを使用している場合にも可能です。

4
Anthony Choi

時々、現在のソースコードと一致しない無効な.pycファイルがこの問題を引き起こしました。

すべての.pycを削除して、このbashを使用してすべてを更新しました

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

2
Michael Henry

これを解決する最も簡単で簡単な方法は、作業中のモデルファイルの下部に「信号のインポート」コマンドを配置することです。これにより、そのモデルの信号がインポートされる前に、モデルがすべてロードされます。これは、インポートする各モデル(特定のモデルにリンクされたレシーバーを使用する場合)、または設定の「インストール済みアプリ」の最後にあるアプリの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

そのように。

1
MontyThreeCard

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シグナルパッケージ内のシグナルレシーバーを移動しました。

0
Netro