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를 참조할 수 있게 된다.
장고와 파이썬은 클래스를 발견하면 문자열로 바꾸어준다.
현재 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 페이지 제목이 해당 방 이름으로 변경되었다.
각 방별로 비치되는 물품들에 대한 클라스를 추가할 것이다. 가령 어떤 방에 냉장고 청소기 오디오 티비 가 비치된다고 가정하자. 어떤 방은 냉장고, 청소기, 오디오 등 여러개의 물품들에 대한 정보를 포함할 수 있다.
또한 A라는 방에 냉장고가 있어도 B라는 방에도 냉장고가 있을 수 있다. 물품들 또한 여러 개의 방과 연결이 될 수 있다. ManyToMany Relation이 되는 것이다.
class AbstractItem(models_core.TimeStampedModel):
"""Abstract Item"""
name = models.CharField(max_length=80)class Meta:
abstract = Truedef __str__(self):
return self.name
그리고 이어서 클래스를 하나 더 만든다.
class RoomType(AbstractItem):
pass
그리고 Room 클래스에 필드를 추가한다.
room_type = models.ManyToManyField(RoomType, blank=True)
migration을 하자
이제 admin 패널에 Room Type이 생겼다.
RoomType이 뜨긴 했는데 내용이 아무것도 없다. admin을 손보자.
@admin.register(models.RoomType)
class ItemAdmin(admin.ModelAdmin):
"""Item Admin"""pass
그러면 admin 패널의 Room type에 내용을 추가할 수 있는 버튼이 생긴다.
ForeignKey에 붙는 Arguments중에 on_delete라는게 있다. 만약 ForeignKey가 삭제된다면 그것과 연동된 정보들을 어떻게 처리할 것인지 지정하는 것이다.
tomato라는 Host와 연동된 LALALA HOUSE가 있다.
이때 tomato라는 user를 삭제하면 다음과 같이 그 아래로 연동된 다른 정보들도 삭제한다는 안내가 뜬다.