#7.5 Reverse Accessors (11:27) - airbnb-clone-backend

star_is_mine·2022년 11월 9일
0

airbnb_clone_coding_backend

목록 보기
12/14

배운점

  1. reverse accessors (ex. room.owner_set.all() )
  2. related name
# reverse accessors 에 관한 코드만 정리함. 
from rooms.models import Room 

room = Room.objects.get(id=1)
room.owner
room.owner.username # 여기서 username 필드는 본래 Room 모델에 존재하지 않는 필드이다. 
# username 필드는 owner 즉 "users.User" 에 존재하는 필드이다. 
# 그럼에도 불구하고 reverse accessors 방식을 통해서 우리는 Room 모델을 통해서 User 모델 필드의 정보에 접근가능한 것이다.

dir(room)
>>> # dir(room)을 실행해보면 xxxx_set 명령어가 보일 것이다.

room.owner_set.all() # This is reverse accessors

# related_name 에 관한 코드만 정리함
from django.db import models
from common.models import CommonModel


class Room(CommonModel):
    name = models.CharField(max_length=180, default="",)
    price = models.PositiveIntegerField()
    rooms = models.PositiveIntegerField()
    description = models.TextField()
    pet_friendly = models.BooleanField(default=True,)
    owner = models.ForeignKey(
        "users.User",
        on_delete=models.CASCADE,
        related_name="rooms",
    )
    amenities = models.ManyToManyField(
        "rooms.Amenity",
        related_name="rooms",
    )
    category = models.ForeignKey(
        "categories.Category",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="rooms",
    )

    def __str__(room) -> str:
        return room.name

    def total_amenities(room):
        return room.amenities.count()
        
# 위 코드는 7.6 related_name 커밋파일 중 rooms/models.py 파일 중 일부 내용만 발췌한 코드입니다. 

# 위 코드에서 주의깊게 봐야할 핵심 point 는 아래와 같습니다. 
# 첫째. related_name="rooms" 코드가 ForeignKey 또는 ManyToManyField 등 ORM 필들에 사용된 점 
# 둘째. related_name="rooms" 코드가 owner 필드, amenities 필드, category 필드에 중복해서 총 3번 사용되었다는 점
# 셋째. 위와 같이 모두 동일한 내용의 코드가 동일하게 중복하여 사용된 이유는 owner 필드, amenities 필드, category 필드가 가리키는 모델 오브젝트에서 class Room 을 접근하기 위한 명칭으로 related_name이 사용되기 때문입니다. 

# 즉, 예를들어서 owner 필드가 가리키는 users.User 모델이 가리키는 class Room 의 갯수 등을 검색하고자 할 때 User.rooms.count() 라고 사용하고 이때 사용된 .rooms가 바로 related_name 입니다. 

핵심명령어 정리

  1. room_set, review_set...
  2. related_name = "rooms",
from user.models import User

user = User.objects.get(pk=1)
user.review_set.all()
user.reviews.all()

# user.review_set.all() 코드와 user.reviews.all() 코드는 동일하다. 단, review 모델에서 user 를 가리키고 있는 ORM 필드에서 related_name = "reviews" 이를 지정한 경우에 그렇다. 

None


Note

profile
i have a dream and I will make my dreams come true.

0개의 댓글