데이터베이스 동작 중 save(), delete()와 같은 함수들을 커스터마이징해서 원하는 작업을 하게끔 만들 수 있다.
DB 작업 중 저장하기 전 처리해야할 로직을 처리할 때
ex : 유효성 검사, 이미지 필드 delete 시 디스크의 파일까지 삭제 등
*file field를 delete할 시 파일은 삭제가 안되는 이유
override할 함수에 필요한 로직을 설정하고 해당 기능을 수행하는 super().~~~가 실제로 DB작업을 수행한다.
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self, *args, **kwargs):
if self.name == "LeeJeil": # 값을 비교해 저장하지 않을 수 있다
return
else:
super().save(*args, **kwargs) # 실제 save()를 호출해서 save() 진행
또는 pre_save(), post_save()와 같은 함수들을 재정의해 사용 할 수있다.
save 실행 로직
부모 메서드 호출을 다음과 같이 사용해도 되지만
super(모델명,self).save(*args, **kwargs)
python 3.x 버젼의 경우 클래스 이름과 self는 선택적 매개변수가 됩니다.
super().save(*args, **kwargs)
다량의 작업(Query Set Class)에서
Overridden model methods are not called on bulk operations
Note that the delete() method for an object is not necessarily called when deleting objects in bulk using a QuerySet or as a result of a cascading delete. To ensure customized delete logic gets executed, you can use pre_delete and/or post_delete signals.
Unfortunately, there isn’t a workaround when creating or updating objects in bulk, since none of save(), pre_save, and post_save are called.