- reverse accessors (ex. room.owner_set.all() )
- 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 입니다.
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