04.-2 Rooms 앱

조재훈·2022년 7월 17일
0

Clone_Airbnb

목록 보기
10/31
post-thumbnail

1) ForeignKey

rooms - models.py - Room

host = models.ForeignKey(models_user.User, on_delete=models.CASCADE)

ForeignKey 관계에서 room은 단 하나의 host를 갖는다. host는 여러개의 room을 가질 수 있다.

ForeignKey가 설정된 host 필드에는 user의 id가 저장되며, 해당 id를 가진 user를 참조할 수 있게 된다.


2) __str__ 메소드

장고와 파이썬은 클래스를 발견하면 문자열로 바꾸어준다.
현재 admin 페이지의 Rooms 생성 페이지에서는 Host에 다음과 같이 표시된다.

만약 users model에서 __str__ 을 다른 값으로 설정한다면?

def __str__(self):
   return "potato"

User 모델 단위에서 클래스 자체의 문자열 반환값을 "potato"로 지정했기 때문에 user를 어떤 이름으로 몇명을 만들던 potato가 여러개 생기게 된다.

potato가 아닌 좀 더 얌전한 이름으로 바꿔보자

def __str__(self):
   return self.username

그러면 rooms 모델의 Room 클래스에도 적용하자.

def __str__(self):
   return self.name

admin 페이지의 Rooms 페이지 제목이 해당 방 이름으로 변경되었다.

3) Room 내 item 추가

각 방별로 비치되는 물품들에 대한 클라스를 추가할 것이다. 가령 어떤 방에 냉장고 청소기 오디오 티비 가 비치된다고 가정하자. 어떤 방은 냉장고, 청소기, 오디오 등 여러개의 물품들에 대한 정보를 포함할 수 있다.
또한 A라는 방에 냉장고가 있어도 B라는 방에도 냉장고가 있을 수 있다. 물품들 또한 여러 개의 방과 연결이 될 수 있다. ManyToMany Relation이 되는 것이다.

class AbstractItem(models_core.TimeStampedModel):
   """Abstract Item"""
   
   name = models.CharField(max_length=80)

    class Meta:
       abstract = True

    def __str__(self):
       return self.name

그리고 이어서 클래스를 하나 더 만든다.

class RoomType(AbstractItem):
   pass

그리고 Room 클래스에 필드를 추가한다.

room_type = models.ManyToManyField(RoomType, blank=True)

migration을 하자

이제 admin 패널에 Room Type이 생겼다.

4) RoomType admin 구현

RoomType이 뜨긴 했는데 내용이 아무것도 없다. admin을 손보자.

@admin.register(models.RoomType)
class ItemAdmin(admin.ModelAdmin):
   """Item Admin"""

    pass

그러면 admin 패널의 Room type에 내용을 추가할 수 있는 버튼이 생긴다.

5) on_delete

ForeignKey에 붙는 Arguments중에 on_delete라는게 있다. 만약 ForeignKey가 삭제된다면 그것과 연동된 정보들을 어떻게 처리할 것인지 지정하는 것이다.

  • CASCADE의 경우 폭포수처럼 해당 FK와 연동된 데이터들을 타고 내려오면서 다 지워버리는 것이다.

tomato라는 Host와 연동된 LALALA HOUSE가 있다.
이때 tomato라는 user를 삭제하면 다음과 같이 그 아래로 연동된 다른 정보들도 삭제한다는 안내가 뜬다.

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

0개의 댓글