딱히 특별한 기술이 아니라, 반복되는 코드를 줄이기 위해 core app을 만들어서 관리하는 일종의 방법론이다.
django-admin startapp core
config/setting의 INSTALLED_APPS에 core/apps.py에 정의된 Config를 추가해준 후
core/model.py에 반복적으로 사용할 타임스탬프 model을 정의해보았다.
여기서 정의한 모델은 DB에 등록하여 사용할 model이 아니라 다른 model의 바탕이 되는 것이므로 abstract 속성을 True로 해주었다.
편의상 앞으로 이런 model을 Abstract model로 부르자. (so에서도 종종 이렇게 부르기도 하는 걸 보면 표준적...)
from django.db import models
# Create your models here.
class TimeStampedModel(models.Model):
"""This is TimeStamped Model"""
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
# abstract가 True면 DB에는 등록되지 않습니다.
class Meta:
abstract = True
이제 이 TimeStampedModel을 다른 rooms/models.py에서 상속으로 처리할 수 있습니다. 새로 작성한 내용들은 abstract 모델에 추가될 것입니다.
from django.db import models
# 단순히 from core.models import TimeStampedModel로 가져올 수 있지만
# 이것 외에도 다양한 abstract model을 사용할 가능성이 있으므로 통째로 가져옵니다.
from core import models as core_models
# 가져온 abstract model은 상속 처리 합니다.
class Room(core_models.TimeStampedModel):
"""Room Model Definition"""
pass
시험삼아 모델을 좀 더 손보겠습니다.
from django.db import models
from core import models as core_models
from django_countries.fields import CountryField
from users import models as user_models
# Create your models here.
class Room(core_models.TimeStampedModel):
"""Room Model Definition"""
name = models.CharField(max_length=140)
description = models.TextField()
country = CountryField()
city = models.CharField(max_length=80)
price = models.IntegerField()
address = models.CharField(max_length=140)
guests = models.IntegerField()
beds = models.IntegerField()
bedrooms = models.IntegerField()
baths = models.IntegerField()
check_in = models.TimeField()
check_out = models.TimeField()
instant_book = models.BooleanField(default=False)
host = models.ForeignKey(user_models.User, on_delete=models.CASCADE)
참고로, country 필드는 다음 패키지를 활용했습니다. 문서를 읽어보면 쉽게 활용할 수 있습니다.
'Django, Flask > 🔫 Django' 카테고리의 다른 글
Admin panel Customizing (further) (0) | 2020.05.12 |
---|---|
ForeignKey, ManyToManyField로 모델 연결하기 (0) | 2020.05.12 |
User Admin panel Customizing (0) | 2020.05.11 |
Model field/Meta 등을 이용해 model 설계하기 (0) | 2020.05.11 |
Extending the existing User model (built-in User 모델을 대체하기) (0) | 2020.05.11 |