- 장고 공식문서
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
데코레이터 사용 전 👇
사용 후 👇
감사합니다!