* Abstract Base Class
- 어떠한 공통적인 필드를 여러 모델에 삽입하려는 경우에 유용
- 실제로 테이블을 생성하지 않음
- 기본 클래스를 작성후에 그안에 Meta 클래스 작성후 abstract=True 를 넣어줌
- 부모필드 ( 즉 여기선 abstract Class Model ) 과 같은 이름을 가지는 자식클래스의 안의 필드를 정의 할 수 없습니다.
from django.db import models class CommonInfo(models.Model): name = models.CharField(max_length=100) age = models.PositiveIntegerField() class Meta: abstract = True class Student(CommonInfo): home_group = models.CharField(max_length=5)
여기서 Student 는 name, age, home_group의 필드를 가집니다.
그리고 Student는 name과 age를 정의할 수 없다는 뜻입니다.
최대의 장점으로는 자식 모델당 하나의 데이터베이스 테이블만 생성하면서 Python 레벨에서 공통적인 정보를 제외시킬수 있다는 점입니다.
자식 클래스가 자신의 Meta 클래스를 선언하지 않으면, 부모클래스의 Meta를 상속 받습니다. 자식이 부모의 Meta 클래스를 확장하려고 하면 아래와 같이합니다.
from django.db import models class CommonInfo(models.Model): # ... class Meta: abstract = True ordering = ['name'] class Student(CommonInfo): # ... class Meta(CommonInfo.Meta): db_table = 'student_info'
[Multi table 상속]
Django 가 지원하는 모델 상속의 두번째 유형은 계층 구조의 각 모델이 모두 하나의 모델일때 입니다.
이 방법은 복잡하고, 느리므로 최대한 사용하지 않는 것을 권장합니다.
각 모델은 자체 데이터베이스 테이블에 해당하며 개별적으로 쿼리하고 생성 할 수 있습니다.
from django.db import models class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) class Restaurant(Place): serves_hot_dogs = models.BooleanField(default=False) serves_pizza = models.BooleanField(default=False)
Place의 모든 필드는 Restaurant에서 사용 할 수 있고, 데이터는 다른 데이터베이스 테이블에 저장됩니다. 그래서 둘다 가능.
[ Proxy Model ]
다중 테이블 상속을 사용할 때 모델의 각 하위 클래스에 대해서 새로운 데이터 베이스 테이블을 생성하는 방법입니다.
프록시의 제일큰 특정은 원본을 변경하지 않고 프록시에서 기본 모델 순서 또는 기본 관리자와 같은 것을 변경할 수 있다는 것입니다.
from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class MyPerson(Person): class Meta: proxy = True def do_something(self): # ... pass
여기서 보면 MyPerson 클래스는 상위 Person 클래스와 동일한 데이터 베이스 테이블에서 작동합니다. 특히 Person의 새 인스턴스는 MyPerson을 통해 엑세스 할 수 있으며, 그 반대의 경우도 가능하다는 것입니다.
>>> p = Person.objects.create(first_name="foobar") >>> MyPerson.objects.get(first_name="foobar") <MyPerson: foobar>
또한 프록시 모델을 사용해서 모델에서 원본모델에서 사용하는 ordering을 정의할 수도 있습니다.
class OrderedPerson(Person): class Meta: ordering = ["last_name"] proxy = True
'Python > Django' 카테고리의 다른 글
[Pycharm] 윈도우즈에서 runserver시 process exit 발생시 (0) | 2017.04.05 |
---|---|
[Django]Coding Style (0) | 2017.04.03 |
[Django] model.Manager (0) | 2017.03.13 |
[Django] RestfulFramework - Permission (0) | 2017.03.13 |
[Django] RestFrameWork 튜토리얼 - 3. 클래스 base View (0) | 2017.03.10 |