본문 바로가기

개발/장고

[해설과 함께 읽는 Django 문서] Model methods

반응형

Model methods

Date: Apr 3, 2021

원문

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

모델 메소드

당신의 객체에 "row-level"의 기능을 커스텀하여서 추가하기위해서 custome method를 모델에 정의해라. Manager 메소드가 "table-wide" 를 의도하는 것과 다르게, 모델 메소드는 특정 모델 인스턴스에 대한 행동을 해야한다.

이것은 비즈니스 로직을 1군데에서 유지하는 가치있는 기술이다. - 모델에서

예를 들면, 이 모델은 몇개의 커스텀 메소드를 가진다.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    @property
    def full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)

위 예제에서 마지막 메소드는 property 이다.

model instance reference 문서에서는 각 모델에 기본적으로 주어진 메소드들이 정의되어 있다. 당신이 이것들을 재정의하여 사용할 수 있으나 - overriding predefined model methods 문서를 보자- 자주 사용하는 몇개를 보면,

  1. __str__()

    이것은 파이썬 매직 메소드 이다. 매직 메소드는 어떤 객체의 문자열 표현을 리턴한다. 이것은 파이썬과 장고가 언제든지 모델인스턴스를 강제로 변환하고, 일반 문자열로 표시해야 할 떄마다 사용하는 것이다. 특히 이것은 콘솔이나 어드민 에서 당신이 객체를 표현할 때 발생한다.

    당신은 항상 이 메소드를 정의하길 원할 것이다.; 그렇게 도움이 되진 않는다

  2. get_absolute_url()

    이것은 한 객체를 위해서 장고가 URL을 계산하는지를 말한다. 장고는 어드민 인터페이스에서 이것을 사용하고, 객체를 위해서 URL을 찾아야하는일이 필요하면 언제나 사용된다.

    유니크하게 식별할 수 있는 URL을 가지는 객체는 위 메소드를 정의해야 한다.


내 마음대로 해설

이 부분에서 하이라이트 설명은 모델 메소드는 "row-level" 이라는 것이다.

즉, 내가 모델 인스턴스와 관련해서 "row-level" 단에서, 무언가 재사용 할 수 있는 메소드를 만들고 싶다면, 모델 이하에 메소드를 생성하면된다. "row-level" 이란 말을 쉽게 풀어보면, 테이블에서 1줄을 말하고, 이는 장고 모델 기준으로는 인스턴스 1개를 가리킨다. 반면에, Manager 에서는 "table-wide"로 다룬다고 한다. 장고 모델의 기본 manger는 objects 이다. 우리가 흔히 쓰는 Person.objects.all() 등의 ORM을 작성할 때, 모델로 부터 우리가 원하는 값을 쿼리할 수록 도와주는 인터페이스 이다.

테이블을 기준으로 복수개의 row를 뽑아 내고 싶을 때는 Manager, 1개의 인스턴스 혹은 row에 대해서 재사용 가능한 메소드를 만들 때는 모델 클래스의 메소드를 작성하자.

그 외, __str__ , __get_absolute_url__ 이 나왔는데 크게 중요하다기 보다는 필요할 때 적절히 활용하면 좋을 것 같다.

반응형