Django

django signal pre_save

끈끈 2023. 6. 15. 22:35

 

Django의 Signal은 특정 이벤트 발생시,

 

해당 이벤트에 연결된 함수들을 자동으로 호출해주는 기능.

 

from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.core.files.storage import default_storage


class Community(models.Model):

    def validate_image(self):
        if self.size > 5*1024*1024:
            raise ValueError("이미지의 크기는 5MB 이하여야 합니다.")

    image = models.ImageField(upload_to="community_img/", null=True, blank=True, validators=[validate_image])


@receiver(pre_save, sender=Community)
def pre_save_receiver(sender, instance, **kwargs):
    if instance.pk is None:
        pass
    else:
        new = instance
        old = sender.objects.get(pk=instance.pk)
        if old.image and old.image != new.image:
            default_storage.delete(old.image.path)

 

위 코드는 이미 존재하는 Community의 객체인 경우 이전 이미지를 삭제해준다.

 

pre_save 시그널은 모델의 인스턴스가 실제로 데이터베이스에 저장되기 전에 실행되므로,

 

저장하기 전에 추가적인 작업을 수행할 수 있게 해주는 것.

 

@receiver 데코레이터를 사용해 함수를 시그널에 연결,

 

sender 매개변수를 통해 pre_save 시그널을 사용하려는 모델 클래스를 전달하였다.

 


 

자주 사용되는 Django의 Signal 함수

 

pre_save: 모델의 save() 메서드가 호출되기 전에 발생

post_save: 모델의 save() 메서드가 호출된 후에 발생

pre_delete: 모델의 delete() 메서드가 호출되기 전에 발생

post_delete: 모델의 delete() 메서드가 호출된 후에 발생

pre_init: 모델의 인스턴스가 초기화되기 전에 발생

post_init: 모델의 인스턴스가 초기화된 후에 발생

m2m_changed: Many-to-many 관계 필드의 변경이 감지되었을 때 발생

 

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

'Django' 카테고리의 다른 글

Django 50문 50답  (4) 2023.07.26
drf filter __ 언더스코어  (4) 2023.06.14
drf swagger 문서화  (1) 2023.05.29
Django admin 페이지 커스텀하기  (1) 2023.05.23
Django sqlite3 mysql로 변경하기  (11) 2023.05.09