代码之家  ›  专栏  ›  技术社区  ›  Ahmed Yasin

我们可以在apps.py中使用post_save信号吗?

  •  1
  • Ahmed Yasin  · 技术社区  · 1 年前

    那里 我正在使用django-python。 我有自定义的用户模型。我已经创建了一个单独的django信号文件。这是我的方法。 我正在我的apps.py中导入它们,并想在那里使用。 因为,迁移后的信号是这样工作的。但post_save是取模的不同原因。而postmigrate则使用app-name。 您可以更好地理解以下代码。

    信号.py

    import secrets
    from django.core.mail import send_mail
    def create_first_account(sender, **kwargs):
        if sender.name == 'accounts':
            user = User.objects.get_user_by_username("meidan")
            if user:
                return None
            password = secrets.token_hex(4)
            user = User.objects.create(
                username="meidan",
                email="[email protected]",
                password=password 
            )
            user.is_active= True
            User.objects.save_me(user)
            subject = 'Meidan Account'
            message = password
            from_email = settings.EMAIL_HOST_USER
            recipient_list = ['[email protected]']
            send_mail(subject, message, from_email, recipient_list, fail_silently=False)
    
    
    
    def create_first_account(sender,created, **kwargs):
        if sender.name == 'accounts':
            print(created)
    

    apps.py

    from django.apps import AppConfig
    from django.db.models.signals import post_migrate,post_save
    from django.contrib.auth import get_user_model
    
    User = get_user_model()
    class AccountsConfig(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        name = 'accounts'
    
        def ready(self):
            from accounts.signals import generate_banks,create_first_account,create_first_account
            post_migrate.connect(generate_banks, sender=self)
            post_migrate.connect(create_first_account, sender=self)
            post_save.connect(create_first_account,sender=User)
    

    现在出现错误。

      File "/home/aa/playapp-backend/envMy/lib/python3.10/site-packages/django/apps/registry.py", line 201, in get_model
        self.check_apps_ready()
      File "/home/aa/playapp-backend/envMy/lib/python3.10/site-packages/django/apps/registry.py", line 136, in check_apps_ready
        raise AppRegistryNotReady("Apps aren't loaded yet.")
    django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
    
    1 回复  |  直到 1 年前
        1
  •  3
  •   Chukwujiobi Canon    1 年前

    只有在应用程序完全加载时才能访问您的模型 :

    def ready(self):
        from django.contrib.auth import get_user_model
        User = get_user_model()
        #•••Rest of code•••

    get_user_model() 将在您的项目中搜索当前活动的用户模型,因此它将搜索所有应用程序。由于所有的应用程序还没有像这个一样准备好,你会看到错误。

    推荐文章