Django Framework - Model Override

이제일·2021년 4월 4일
0

Django

목록 보기
13/15
post-thumbnail

Override

데이터베이스 동작 중 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)에서


따라서 Model.objects.get()과 같은 단일 모델 객체를 불러왔을 때(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.

profile
세상 제일 이제일

0개의 댓글