본문 바로가기

Web + APP/Django

추상 모델

반응형
SMALL

본 글은 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
    
...

이런식으로 그냥 넣어준다면 여러분들의 손목을 지킬 수 있는 좋은 방법이 되겠죠.

 

이제 왜 쓰시는지 아시겠죠 !?


이상 추상 모델였습니다. ^_^

반응형
LIST

'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