본문 바로가기

개발/장고

[해설과 함께 읽는 Django 문서] 미리 정의된 모델 메소드 재정의 하기

반응형

원문

한국어로 옮기기 어색한 단어들은 영문으로 혹은 해석이 애매한 구절은 직역한 그대로 사용 하였습니다.

미리 정의된 모델 메소드 재정의하기

당신이 커스터마이징 하기 원하는 데이터베이스 행동을 캡슐화하는 또다른 모델 메소드들이 있다 특히 당신은 save() 와 delete() 를 바꾸길 원할 것이다.

당신은 이러한 메소드들(다른 모델메소드와 함께)를 자유롭게 재정의 할 수 있다

내장 메소드를 재정의하기위한 클래식한 방법은 객체를 저장할 대 마다 어떤 일이 발생하기를 원하는 경우이다 예를들면,

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 
    def save(self, *args, **kwargs): 
    do_something() super().save(*args, **kwargs) # Call the "real" save() method. do_something_else()

또한 저장되는 것을 막을 수 있다.

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 == "Yoko Ono's blog": 
            return # Yoko shall never have her own blog! 
        else: super().save(*args, **kwargs) # Call the "real" save() method.

객체가 데이터베이스에 저장되도록 하기 위해 슈퍼 클래스 메서드를 호출하는 것을 기억하는것이 중요하다 당신이 슈퍼클래스 메소드를 호출하는 것을 잊는다면, 저장되지 않을 것이다.

또한 모델 메쏘드로 넘길 수 있는 arguments를 넘기는 것도 중요하다 - *args, **kwargs. 장고는 때때로 내장 모델 메소드의 기능을 확장하여 새로운 인수를 추가할 것이다. 이때, *args, **kwargs가 정의되어있으면 추가적인 인수가 생겼을 때 자동적으로 지원할 수 있게 된다.

재정의된 모델 메소드들은 bulk operation에서는 호출되지 않는다.

delete() 메소드의 경우는 쿼리셋을 이용한 벌크 삭제나 cascading delete 의 결과에 대해서는 호출되지 않음을 알아야한다. 커스텀된 delete logic의 실행을 확인하려면, pre_delete 나 post_delete 시그널이 호출되어야 한다.

불행하게도, 벌크로 creating 이나 updating 할 때는 해결책이 없다,이유는 save(), pre_save 나, post_save가 호출되지 않기 때문이다.


내 마음대로 해설

오늘 번역 한 내용 중, 중요한 부분은 아래와 같다.

  1. 미리 정의된 내장 메소드들을 재정의 하여 사용할 수 있다.
  2. 대표적으로 save()를 재정의하여 사용할 수 있다
    1. 슈퍼클래스의 save()를 호출하는 이전과 이후로 나눌 수 있다.
    2. 저장하려면 반드시, super().save(*args, **kwargs) 를 호출해야한다.
  3. *args, **kwargs 는 나중에 추가적인 인자를 넘길 때 필요할 수도 있기 때문에, 디폴트로 써주면 좋다
  4. bulk 에서는 호출되지 않는다
    1. delete()
      1. pre_delete와 post_delete 를 통해서 customized 된 delete 메소드 실행여부를 확인할 수 있다.
    2. creating, updating()
      1. bulk 호출 시에, save(), pre_save, post_save를 호출하지 않기 떄문에, 확인이 불가하다.
반응형