본문 바로가기
Project/에어비앤비 (with Django)

[Django] Room Application 생성

by 발담그는블로그 2021. 1. 6.

 

Common Application

모든 프로그램을 만들때는 여러 application에 필요한 중복되는 필드들이 존재한다. 이와 같은 경우에 생성하는 것이 Abstract Model이다.
에어비앤비를 구성할 Rooms, Reviews 등 많은 Application에서 공통적으로 사용되는 것들을 저장할 Application을 만들어준다. 

1. setting.py - app 추가

2. models.py - 추상 class 생성

from django.db import models

# Create your models here.
class TimeStampedModel(models.Model):

    """ Time Stamped Model """

    created = models.DateTimeField(auto_now_add=True)	#auto_now_add: 생성할때 자동값 저장
    updated = models.DateTimeField(auto_now=True)		#auto_now: 저장할때마다 자동값 저장

    # extra information
    class Meta:
        abstract = True

core의 models 파일에서 필드를 추가할때, 다른 application과 다른 점이 있다. 기존에는 해당 application의 내용을 그대로 저장하기 위해서 models의 파일을 그대로 이용했다. 하지만 core의 경우 다른 application에서 사용할 필드들을 저장할 것이기 때문에, 여기에서 생성된 필드들이 DB에 저장되면 안된다. 따라서, model class안에 class를 만들어 extra information를 저장한다. 

abstract = True 를 선언함으로써 현재 model이 아닌 상속받은 model의 경우에만 데이터를 만들도록 설정할 수 있다. 

 

Rooms Application 등록

1. setting.py - app 추가

2. admin.py - models.py 등록

from django.contrib import admin
from . import models

# Register your models here.
@admin.register(models.Room)
class RoomAdmin(admin.ModelAdmin):

    pass

3. models.py - field 생성

# import os  # 0. python 관련 모든 패키지 설치
from django.db import models  # 1. django 관련 모든 패키지 설치
from core import models as core_models  # 2. Thrid-Party 패키지 설치
from django_countries.fields import CountryField  # 3. 내가 만든 패키지 설치
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)

 

반응형