04.-1 Rooms 앱

조재훈·2022년 7월 17일
0

Clone_Airbnb

목록 보기
9/31
post-thumbnail

1) settings.py에 앱 등록

새로운 앱을 settings.py에 등록한다.
이때 등록하는 클래스의 이름은 rooms - apps.py에 있는 RoomsConfig로 한다.

PROJECT_APPS = [
   "users.apps.UsersConfig",
   "rooms.apps.RoomsConfig",
]


2) models & admin 생성

일단 임시로 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가 떠있는 것을 볼 수 있다.

물론 아직 내용은 없다.

3) core 앱 생성

무언가를 생성, 변경하는 필드는 기능은 동일하지만 여러 군데서 사용될 수 있다. 숙소를 등록/변경하거나 유저가 가입/수정하거나 등등.
이런 것들을 일일이 복사해서 붙여넣기보다는 클래스를 만들어놓고 여기서 불러와서 쓰도록 하자.

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에 등록해주자

4) core 앱 상속

다시 rooms로 돌아와서 models.py를 수정해보자.
rooms - models.py

from django.db import models
from core import models as models_core

class Room(models_core.TimeStampedModel):
"""Room Model Definition"""

pass

5) Room 클래스 필드 추가

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모델과 연결된 것도 볼 수 있다.

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글