Можно ли использовать сигналы post_save в apps.py?

Здесь. Я использую django python. У меня есть пользовательская модель пользователя. Я создал отдельный файл сигналов django. там есть мой метод. Я импортирую их в apps.py и хочу использовать там. Потому что, сигналы post_migrate работают именно так. но post_save отличается, потому что он принимает модель. в то время как postmigrate работают с именем приложения. Лучше понять это можно с помощью следующего кода.

signals.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="meidanpk@gmail.com",
            password=password 
        )
        user.is_active= True
        User.objects.save_me(user)
        subject = 'Meidan Account'
        message = password
        from_email = settings.EMAIL_HOST_USER
        recipient_list = ['ahmedyasin1947@gmail.com']
        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.

Доступ к моделям возможен только при полной загрузке приложений:

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

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

Вернуться на верх