본문 바로가기
Web developer/Django

[Django] 모델 상속

by doongjun 2020. 11. 6.

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>

 

출처 : docs.djangoproject.com/en/2.1/topics/db/models/#

'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

댓글