Django Framework - Model Override
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)에서
- delete 작업 시 pre_delete() or post_delete()를 사용해야 안전하게 진행할 수 있다.
- update, create 작업(save 기능)은 사용이 제한된다.
따라서 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.
Author And Source
이 문제에 관하여(Django Framework - Model Override), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dlwpdlf147/Django-Framework-Model-Override저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)