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 관계 필드의 변경이 감지되었을 때 발생