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' 카테고리의 다른 글
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 |