django.db.models.Model 에 모델 상속에는 3가지 종류가있다.
Abstract Base Classes
Multi-table Inheritance
Proxy Models
Abstract Base Classes
class AbstractItem(core_models.TimeStampedModel):
""" Abstract Item """
name = models.CharField(max_length=80)
class Meta:
abstract = True
def __str__(self):
return self.name
class Meta에 'abstract = True' 구문을 넣으면 이 모델은 데이터베이스 테이블을 만드는데 사용이 되지 않고 다른 모델의 기본 클래스로 사용될 때 자식 클래스의 필드가 추가된다.
class RoomType(AbstractItem):
""" RoomType Model Definition """
class Meta:
verbose_name = "Room Type"
ordering = ["created"] # 생성 순으로 정렬
class Amenity(AbstractItem):
""" Amenity Object Definition """
class Meta:
verbose_name_plural = "Amenities" # Amenitys 철자 오류 방지
class Facility(AbstractItem):
""" Facility Model Definition """
class Meta:
verbose_name_plural = "Facilities"
class HouseRule(AbstractItem):
""" HouseRule Model Definition """
class Meta:
verbose_name = "House Rule"
마이그레이션을 생성하면 RoomType, Amenity, Facility, HouseRule 모델에만 데이터베이스가 추가된다.
각각 모델에는 name 필드를 추가로 갖게 되는 것이다.
Multi-table Inheritance
Abstract Base Classes와 달리 추상클래스 없이 상속하는 것이다.
from django.db import models
class CommonInfo(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField(defalut = 0)
class List(CommonInfo):
group = models.CharField(max_length=5)
여러개의 클래스도 상속 받을 수 있다.
Proxy Models
Proxy Models는 인스턴스를 생성, 삭제 및 업데이트 할 수 있으며, 기존의 모델(비 프록시)을 사용하는 것처럼 모든 데이터가 저장된다. 원본 모델을 변경하지 않고 프록시에서 기본 모델의 순서 또는 관리자 같은 것을 변경할 수 있는 것이다. 즉, 기존 모델에서 필요한 기능만 추가해야할 때 사용한다.
프록시 모델은 일반 모델처럼 선언하며. Django에게 meta class에서 proxy속성을 True로 설정하여 프록시 모델이라고 알려줍니다.
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
>>> p = Person.objects.create(first_name="foobar")
>>> MyPerson.objects.get(first_name="foobar")
<MyPerson: foobar>
'Web developer > Django' 카테고리의 다른 글
[Django] 쿼리셋(Query sets) (0) | 2020.11.09 |
---|---|
[Django] ORM #2 (0) | 2020.11.09 |
[Django] ORM #1 (0) | 2020.11.06 |
[Django] 마이그레이션 (0) | 2020.11.06 |
[Django] 어플리케이션 (0) | 2020.11.05 |
댓글