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

0%

Django Models 17편 - Model 상속 (Abstract Base Class) 1

Model Inheritance (Abstract Base Classes)


Abstract Base classes


Abstract base 클래스들은, 여러분들이 어떠한 공통된 정보들을, 다른 모델들에 넣고 싶을때에 유용하게 쓸수 있습니다.


Base 클래스를 작성한다음, Meta class 에다가, abstract=True 로 설정합니다.


그러면, 해당 모델은, 데이터베이스를 생성하는데에 사용되지 않습니다.


다른 모델들의 Base 클래스로 사용될때에는,

Base 클래스의 필드들이 자식 클래스들에 추가 됩니다.


예시를 들자면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from django.db import models 

class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()

class Meta:
abstract = True
# class Meta 를 선언함으로써, 다른 모델들이 상속 받을수 있는 모델이 됨


class Student(CommonInfo):
# 공통된 정보를 가지고 있는 CommonInfo 클래스를 상속받는 Student 클래스 모델
home_group = models.CharField(max_length=5)


class Teacher(CommonInfo):
# 공통된 정보를 가지고 있는 CommonInfo 클래스를 상속받는 Teacher 클래스 모델
teaching_subject = models.CharField(max_length=20)

위의 예시에서, CommonInfo 클래스에 있는 name 과 age 필드는,

Student 모델과, Teacher 모델이 상속받는 필드입니다.


따라서, Student 모델은 3가지 필드들을 갖게 됩니다. name, age 그리고 home_group.

비슷한 의미로, Teacher 모델은 name, age 그리고 teaching_subject 필드를 갖게 됩니다.


CommonInfo 모델은 abstract base 클래스 이기 때문에,

CommonInfo 모델은 일반 Django 모델로 사용될수 없습니다.


CommonInfo 모델은 데이터베이스 테이블을 생성하지도 않고, manager 도 갖지 않습니다 (object 메서드를 가지지 않습니다). 그리고, 직접적인 인스턴스 생성과 저장도 되지 않습니다.


abstract base class 에서 상속받은 필드들은 다른 필드 혹은 값으로 override 될수 있습니다.


혹은, None 으로 제거 될수 있습니다.


abstract base 클래스 상속 방식은, 공통된 정보를 파이썬 레벨에 두고,

각각의 자식 모델마다 한개의 데이터베이스 테이블을 데이터베이스에 생성합니다.


실제로 위의 예시에서 CommonInfo 클래스로 Shell 에 들어가서, 몇가지 명령어를 실행해보면, 에러가 납니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
In [1]: common = CommonInfo.objects.create(name="django", age=22)                                                                                                         
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-8d6637697465> in <module>
----> 1 common = CommonInfo.objects.create(name="django", age=22)

NameError: name 'CommonInfo' is not defined

In [2]: CommonInfo.objects.all()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-2-fc35ec638311> in <module>
----> 1 CommonInfo.objects.all()

NameError: name 'CommonInfo' is not defined

In [3]: c = CommonInfo()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-3-2542378fc97f> in <module>
----> 1 c = CommonInfo()

NameError: name 'CommonInfo' is not defined