应用程序尚未加载(学习信号时)

Apps aren't loaded yet (when learning signals)

我正在尝试学习信号。在下面的 apps.py 中有几行注释。一旦我取消注释 from .models import ReceiverModel, SenderModel,我就会得到 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

你能帮我理解我做错了什么吗?

demo_signals/my_app/models.py

from django.db import models
from django.dispatch import receiver
from django.db.models.signals import post_save

class SenderModel(models.Model):
    pass

class ReceiverModel(models.Model):
    pass

    @receiver(post_save, sender=SenderModel)
    def my_callback(self, sender, **kwargs):
        print("Saving finished!")

demo_signals/demo_signals/settings.py

INSTALLED_APPS = [
    ...
    'my_app.apps.MyAppConfig',
]

demo_signals/my_app/apps.py

from django.apps import AppConfig
from django.db.models.signals import Signal
#from .models import ReceiverModel, SenderModel


class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print("Here")
        #Signal.connect(self, ReceiverModel, SenderModel)

追溯的一部分

  File "/home/michael/workspace/demo_signals/my_app/apps.py", line 3, in <module>
    from .models import ReceiverModel, SenderModel
  File "/home/michael/workspace/demo_signals/my_app/models.py", line 5, in <module>
    class SenderModel(models.Model):
  File "/home/michael/workspace/PhotoArchive/venv/lib/python3.5/site-packages/django/db/models/base.py", line 94, in __new__
    app_config = apps.get_containing_app_config(module)
  File "/home/michael/workspace/PhotoArchive/venv/lib/python3.5/site-packages/django/apps/registry.py", line 240, in get_containing_app_config
    self.check_apps_ready()
  File "/home/michael/workspace/PhotoArchive/venv/lib/python3.5/site-packages/django/apps/registry.py", line 125, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")

根据 the docs,您不能在 AppConfig 中以这种方式导入模型,而您需要这样做:

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        ReceiverModel = self.get_model('ReceiverModel')
        SenderModel = self.get_model('SenderModel')
        Signal.connect(self, ReceiverModel, SenderModel)