Django Signal

GisangLee·2022년 9월 21일
0

django

목록 보기
20/35

1. 개념

분리된 어플리케이션의 작업이 발생했음을 알려주고 처리할 수 있는 기능

  • JS의 이벤트 리스너와 유사한 개념

2. 공식 문서

원리 설명 영상


3. 메서드

pre_save

This is sent at the beginning of a model’s save() method.

  • DB에 데이터가 저장되기 전 호출.
  • 필드를 변경하고 save() 메서드를 작성하면 무한 recursion 루프에 빠지기 때문에 조심.

post_save

Like pre_save, but sent at the end of the save() method.

  • DB에 데이터가 저장된 이후 호출.
  • pre_save 메서드 이후 자동으로 호출된다.
  • 필드를 변경하면 save()메서드로 저장해주어야한다. ( DB에 데이터가 저장된 이후 호출되기 때문 )

작동 순서

pre_save -> 데이터 DB에 저장 -> post_save

사용예

모델의 필드를 변경하거나 FK 또는 M2M을 추가하거나 변경할 때


pre_delete

Sent at the beginning of a model’s delete() method and a queryset’s delete() method.

post_delete

Like pre_delete, but sent at the end of a model’s delete() method and a queryset’s delete() method.

m2m_changed

Sent when a ManyToManyField is changed on a model instance. Strictly speaking, this is not a model signal since it is sent by the ManyToManyField, but since it complements the pre_save/post_save and pre_delete/post_delete when it comes to tracking changes to models, it is included here.


4. 파일 작성

signals.py

from django.db.models.signals import post_save
from app.user.models import User, Profile
from django.dispatch import receiver
import logging

logger = logging.getLogger(__name__)

@receiver(post_save, sender=User)
def create_my_signal(sender, instance, created, **kwargs):
	
    if created:
    
    	try:
        	profile = Profile.objects.create(
            	user = instance,
                username = instance.username
            )
            
       	except Exception as e:
        	logger.error(e)

apps.py

from django.apps import AppConfig

class UsersConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'users'
    
    # 기본적으로 여기까지 되어있음
    
    def ready(self): # ready메소드 추가
    	import app.users.signals
``

profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/

0개의 댓글