새로운 앱을 settings.py에 등록한다.
이때 등록하는 클래스의 이름은 rooms - apps.py에 있는 RoomsConfig로 한다.
PROJECT_APPS = [
"users.apps.UsersConfig",
"rooms.apps.RoomsConfig",
]
일단 임시로 models.py와 admin.py에 클래스를 생성한다.
rooms - models.py
class Room(models.Room):
"""Room Model Definition"""
pass
rooms - admin.py
from django.contrib import admin
from . import models@admin.register(models.Model):
class RoomAdmin(admin.ModelAdmin):
"""Room Admin"""
pass
admin 페이지에 가면 Rooms가 떠있는 것을 볼 수 있다.
물론 아직 내용은 없다.
무언가를 생성, 변경하는 필드는 기능은 동일하지만 여러 군데서 사용될 수 있다. 숙소를 등록/변경하거나 유저가 가입/수정하거나 등등.
이런 것들을 일일이 복사해서 붙여넣기보다는 클래스를 만들어놓고 여기서 불러와서 쓰도록 하자.
core 라는 앱을 생성한다. 이 자체로는 별 기능을 안하지만 다른 앱들에 상속시키는 공통 기능들이 들어있다.
django-admin startapp core
core앱의 models.py에 클래스를 생성하자
from django.db improt models
class TimeStampedModel(models.Model):
"""Time Stamped Model"""created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
그런데 우리는 이 클래스가 DB에 등록되기를 원하진 않는다. 다른 모델에 필드를 부여해주는 상속 전용으로 사용할 예정이다. 이 경우 클래스 내부에 Meta 클래스 선언을 해줘야 한다. 그리고 여기에 여러 부가 설명을 적어 설정을 제어할 수 있다.
abstract=True 는 이 클래스를 추상 모델로 만들겠다는 의미이다. 즉, 상속 전용.
class Meta:
abstract = True
여기서 auto_now는 해당 모델이 저장된 때의 시간을 필드에 입력해준다. (every time the object is saved).
auto_now_add는 해당 모델이 처음으로 생성된 때의 시간을 필드에 입력해준다. (when the object is first created)
앱을 생성했으니 settings.py에 등록해주자
다시 rooms로 돌아와서 models.py를 수정해보자.
rooms - models.py
from django.db import models
from core import models as models_coreclass Room(models_core.TimeStampedModel):
"""Room Model Definition"""pass
Room 클래스에 여러 필드들을 추가할 것이다.
이 중 country는 모든 국가명을 일일이 입력하기보다 django-countris 라는 라이브러리를 사용할 것이다.
https://github.com/SmileyChris/django-countries
콘솔에서 아래와 같이 실행하자
pipenv install django-countries
설치가 완료되면 settings.py에 들어가서 THIRD_PARTY_APPS에 추가해주자
그리고 django-countries에서 클래스를 import 해오자
from django_countries.fields import CountryField
class Room(models_core.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(models_user.User, on_delete=models.CASCADE)
여기서 host의 경우에는 등록되어있는 user 이기도 하다. 즉, 다른 모델과의 연결이 필요하다. 이때는 ForeignKey 라는 것을 사용한다.
자 이제 migration을 해주자.
잘 추가되었다.
Host 필드가 User모델과 연결된 것도 볼 수 있다.