본 글은 https://docs.djangoproject.com/en/3.0/topics/db/models/을 참고한 글입니다.
Abstarct Base classes, 추상 모델은 다른 많은 모델에 공통적인 정보를 넣고 싶을 때, 사용하면 굉장히 좋습니다.
그냥 class에서 abstract = True를 하면 바로 추상 모델로 변신이 가능합니다.
추상 모델의 경우 DB Table에 영향을 주지 않습니다. 대신 다른 모델을 위해 base class로 사용이 됩니다.
from django.db import models
class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
clas Meta:
abstract = True
class Student(CommonInfo):
home_group = models.CharField(max_length=5)
Student class는 CommonInfo를 인자를 받게되어 세가지의 인자를 가지고 있습니다. name, age, home_group이죠. CommonInfo 모델은 Django model로 사용되지 않습니다. 왜냐면 "abstract base class (추상화 모델)"이니까요.
DB Table이 생성되지 않고, manager도 안가지고, 그냥 아싸입니다. 저처럼 아싸
abstract base classes를 상속받은 필드는 override도 할 수 있습니다. 또, 지울 수도 있어요.
이러한 유형의 모델 상속은 아마 많은 곳에 쓰일 것입니다. 딱 봐도 유용해보이지 않나요?
아니라고 생각하시니, 한 번 더 예를 들어보죠.
보통 데이터가 생기거나, 수정될 때의 시간을 기록하는 데이터 row가 각 Table 마다 있을 수 있습니다.
그렇다고, 메시지, 상품, 아파트와 같은 모델을 만들 때, 위의 row를 집어넣는다고 했을 때, 너무 중복이 많을거 같지 않으신가요 ?
그래서 아래와 같이 코드를 짜고 이를 상속 받아서 사용할 수가 있습니다.
from django.db import models
class TimeStampedModel(models.Model):
""" Time Stamped Model """
# auto_now_add를 하면 model이 새로 만들어질 때 시간을 넣어줍니다.
created = models.DateTimeField(auto_now_add=True)
# auto_now를 하면 model이 만들어질 때 시간을 수정해줍니다.
updated = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
자 이런 추상 모델을 만들었다고 생각하고, 이를 각 모델에 집어넣어 봅시다.
from django.db import models
from core import models as core_models # models라는 이름을 쓰면 중복이 되니까, 바꿔줘야합니다.
...
# message/models.py
class Message(core_models.TimeStampedModel):
pass
...
# apartment/models.py
class Apartment(core_models.TimeStampedModel):
pass
...
이런식으로 그냥 넣어준다면 여러분들의 손목을 지킬 수 있는 좋은 방법이 되겠죠.
이제 왜 쓰시는지 아시겠죠 !?
이상 추상 모델였습니다. ^_^
'Web + APP > Django' 카테고리의 다른 글
Get, Post 요청을 모두 알아서 처리하는 FormView ! (4) | 2020.05.30 |
---|---|
Class Based View (0) | 2020.05.10 |
Managers와 QuerySets의 이해 (0) | 2020.05.02 |
커스텀 유저 모델 (0) | 2020.04.29 |
Django Setting 하기 ! (0) | 2020.04.18 |