Можно ли использовать сигналы 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()
будет искать активную в данный момент модель пользователя в вашем проекте, следовательно, он будет искать во всех приложениях. Поскольку все приложения еще не готовы, как это, вы получите ошибку, которую видите.