당신은 멋쟁이, 우리는 장고쟁이~

0%

Django Models 14편 - Model Methods

Model Methods


모델 클래스에는, 사용자 정의 메서드를 추가할수 있습니다. (row-level, 즉, 줄 단위)


Manager 메서드 (objects) 는, table 전체에 적용되고. 모델 메서드들은, 특정한 모델 인스턴스에 적용됩니다.


해당 모델의 인스턴스에 대해서, 특별한 비지니스 로직을 동작하고 싶을때에, 이런 모델 메서드를 사용해서. 하나의 모델에 모아놓고 사용할수 있습니다.


아래 예시에는, 몇가지 사용자 정의 메서드가 정의되어 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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. "
# 해당 사람이, baby_boomer 세대인지 아닌지 판단합니다.
import datetime
if self.birth_date < datetime.datetime(1945, 8, 1):
return "Pre-boomer"
elif self.birth_date < datetime.datetime(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)



예시에서, 마지막으로 작성된 def full_name(self) 메서드는, property 입니다.


모델 인스턴스는 자동으로 각 모델에 부여된 메서드의 목록을 가지고 있고.


아래 예시에서 보면, colin 이라는 인스턴스가 모델에 정의된 메서드들을 사용할수 있다는것을 확인합니다.

1
2
3
4
5
6
7
8
9
10
colin = Person.objects.create(first_name="colin", last_name="firth", birth_date="1961-10-07")

# colin 이라는 객체를 가져옴
colin = Person.objects.get(first_name="colin")

# colin 이라는 인스턴스의 baby_boomer_status 메서드를 호출
colin.baby_boomer_status

# colin 이라는 인스턴스의 full_name 메서드를 호출
colin.full_name



__str__() 메서드


객체의 문자열 표시를 반환하는 파이썬 magic method (매직 메서드) 입니다. 이 메서드는 파이썬과 장고가 언제든 모델 인스턴스가 순수한 문자열로 표시되길 원할때에 사용됩니다.


__str__() 메서드를 사용하면, 해당 모델 인스턴스를 문자열로 표시해서 반환할수 있습니다.


이 메서드는 아주 많이, 많이, 많이, 그리고 자주, 사용되는 메서드입니다.


get_absolute_url()


이 메서드는 Django 에게 어떻게 객체에 대한 URL 을 계산해야 하는지 얘기해 줍니다.


Django 는 이 메서드를 어드민 인터페이스에서 사용합니다. 또는 언제든 객체의 URL 을 알아내야 할때 사용합니다.


어떤 객체든 고유한 URL 이 식별하는 객체일때, 이 메서드로 정의 합니다.


Model Method 연습


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
In [1]: import datetime                                                                                                                                                   

In [2]: colin = Person.objects.create(first_name="Colin",
last_name="Firth",
birth_date=datetime.date(1960, 9, 10))

In [3]: colin.first_name
Out[3]: 'Colin'

In [4]: colin.last_name
Out[4]: 'Firth'

In [5]: colin.birth_date
Out[5]: datetime.date(1960, 9, 10)

In [6]: colin.baby_boomer_status
Out[6]: <bound method Person.baby_boomer_status of <Person: Person object (4)>>

In [7]: colin.full_name
Out[7]: 'Colin Firth'