테이블에는 메소드가 없지만 모델 클레스에는 메소드를 정의할 수 있습니다.
여기서 주의할 점은 클래스 메소드
와 객체 메소드
를 구분하는 거에요.
장고에서는 클래스 메소드를 사용하지 않고 객체 메소드만 사용해요.
즉, 모델 클레스에 정의하는 메소드는 모두 객체 메소드이고 항상 self 인자를 갖고 있으며, 이 메소드들을 호출하면 테이블 단위가 아니라 레코드 단위에만 영향을 줘요.
그럼 테이블의 모든 레코드 수를 카운트하는 것과 같은 테이블 레벨의 동작은 어떻게 할까유?
장고는 클레스 메소드를 사용하는 대신, 별도의 Manager 클래스를 정의하고 Manager 클래스의 메소드를 통해서 테이블에 대한 CRUD 동작을 수행해요.
테이블 레벨에서 동작하는 Manager 클래스의 메소드는 추후 살펴보고 여기선 레코드 레벨
에서 동작하는 객체 메소드에 대해 알아볼게요.
아래 메소드는 자신이 정의된 객체를 지칭하는 URL을 반환해요.
URLconf에서 DetailView 제네릭 뷰를 사용하는 경우가 좋은 예에요. DetailView는 특정 객체에 대한 상세 정보를 보여주는 제네릭 뷰이므로 DetailView와 매핑된 URL을 get_absolute_url()메소드를 사용해 구할 수 있기 때문이에요. 특정 객체의 URL을 구하는 기능은 코드의 여러 곳에서 필요하므로 아래 메소드는 항상정의 해주는게 좋아요.
get_absolute_url()
필드 타입이 DateField 또는 DateTimeField면서 필드 옵션이 null=True가 아닌 경우에는 다음 메소드를 사용할 수 있어요. FOO는 필드명을 의미하고, 필요하면 키워드 인자를 사전형식으로 전달할 수 있어요. 이 함수는 FOO 필드 기준으로 다음 객체를 반환해요. 다음 객체가 없는 경우는 DoesNotExist익셉션이 발생해요.
get_next_by_FOO(**kwargs)
다음 객체가 아니라 이전 객체를 반환한다는 점만 빼고는 get_next_by_FOO()메소드와 동일해요.
get_previous_by_FOO(**kwargs)
필드옵션에 choices 인자가 있으면, 그 모델 객체는 아래 메소드를 제공해요. FOO는 choices인자를 갖는 필드를 의미해요. 이 메소드는 FOO 필드의 설명 문자열을 반환해요.