- 장고 공식문서
Django includes a “signal dispatcher” which helps decoupled applications get notified when actions occur elsewhere in the framework. In a nutshell, signals allow certain senders to notify a set of receivers that some action has taken place. They’re especially useful when many pieces of code may be interested in the same events.

User Model을 사용, Profile Model은 User Model과OneToOneField로 관계를 지어 생성.
- 회원가입(User생성) 시 User Model에만 데이터가 담기게 된다.
- 사용자는 Profile 생성을 위해 회원가입 시 작성했던 내용을 다시 Profile에 작성해야되는 문제발생
- 이를 해결하기 위해
signals사용- 또한 welcome mail 등 다양한 곳에서 활용이 가능하다.
<app_name 나의 경우 users>/models.py에서 필요한 재료 importfrom django.db.models.signals import post_save
- signal 함수 정의 (함수명은 본인 마음대로!) 후 signal 연결
- models.py에서 signal 분리하기
- 데코레이터 사용하기
from django.db.models.signals import post_save
from django.contrib.auth.models import User
def create_profile(sender, instance, created, **kwargs):
if created == True:
user = instance
profile = Profile.objects.create(
owner = user,
user_name = user.username,
email = user.email,
name = user.first_name,
)
post_save.connect(create_profile, sender=User)
created의 경우 작업이 생성이면 True가 반환, 업데이트 등 생성이 아니면 False를 반환한다.
- 지금은 post_save를 사용하는 경우로 파라미터가
(sender, instance, created, **kwargs)이고 post_delete의 경우(sender, instance, **kwargs)
instance값은 연결해주는 Model의 값🔒을 가진다.post_save.connect()의 인수인 sender이 위의 자물쇠의 🔑create()메소드를 이용해 새성
models.py에 model과 signal이 같이 있으면 더러우니 signals.py를 만들어 분리시켜주자signals.py 생성signals.py안에 똑같이 복!붙!
signals.py는 임의로 만든 파일이므로)apps.py이동하여 이렇게 작성해주자from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'users'
# 기본적으로 여기까지 되어있음
def ready(self): # ready메소드 추가
import users.signals
apps.py를 먼저 쫙~읽어들이기 때문에 여기에 설정signals.py는 실행이 안된다.users.apps.UsersConfig
장고에서 제공하는 데코레이터를 사용하면 connect하는 부분을 함수명 위에 설정 가능
from django.dispatch import User
데코레이터 사용 전 👇

사용 후 👇

감사합니다!