초보 개발자

queryset , manytomany 본문

Python/airbnb 클론

queryset , manytomany

taehyeki 2022. 1. 25. 15:04

set이 작동하는 방식은 간단하다.

 

room이 user를 가리키고 있다면 user.room_set 을통해 user에서 room으로 접근이 가능하다.

 

그럼 review모델도 User를 가리키고 있기에 review_set.all()을 통해서도 확인이 가능하다.

여기서 이름을 room_set, review_set 말고, 우리가 지정해줄 수도 있다.

그건 User측에서 하는 것이 아니라, 가리키는 쪽 즉, Room과 Review 모델에서 지정해주어야 한다. host에

related_name옵션을 rooms로 바꾸어보자.

related_name

rooms.models.py

그럼 전에 room_set으로 되어있던것이 지금은 rooms로 바뀐 것을 확인할 수 있다. 바꾼 이상 room_set으로는 접근이 불가하다.

 

먼저 room을 하나 구해준다. 조건으로 pk = 1을주었는데 장고가 기본적으로 만들어주는 id를 primary key라고한다.

pk = id 같은 말이다. 이렇게 id가 1인 room을 구해주었다.

room을 가리키고 있는 것들이 있다. 일단 review도 room을 가리키고 있다.

이 말인 즉슨 room이 review_set을 가지고 있다는 뜻이다.

기억해두자 review가 room을 가리키고 있다면 이제 그 room은 review_set을 얻는 것이다. 

many to many

many to many에접근하는 방법도 알아보겠다

단순히 room.amenities를 해주면 된다. room에서 host를 참조할 때와 마찬가지 였다.

 

User.objects.filter(username(필드명)__startswith)

queryset은 list이고

그 안에 있는 것들은 many to many 혹은 foreign key들이다.

 

이제 반대로 Amenity에서  자기를 가리키고 있는 room들을 찾아보자 room은 manytomany필드로 amenity,facility,house-rule등을 정해두었다. related_name을 rooms로 정해두고

manytomany.rooms(rooms_set).all()

id 1에 해당하는 amenity를 찾은 뒤 a변수에 두고 .rooms.all() 하면 a변수가 들어있는 모든 room이 검색이 된다. 

foregin key와 똑같다.

 

 

 


RoomTypes, Amenity, Facility, HouseRule등을 하나로 묶어 같은 방법으로 표현하게 하였다. 이들은 모두 foreign key 혹은 many to many이다. room모델은 이 모델들을 참조하고 있다.  따라서 이 모델들이 어디어디서 참조되고있는지 그 숫자를 확인하기 위해서 used_by_cnt라는 함수를 만들고 이를 리턴하여 list_display에 보여주도록 하고 싶다.



모두 related_name을 rooms로 설정해두어 각obj에는 rooms가 만들어져있을 것이다. 따라서 자신이 연결 된 rooms에 접속할 수 있고 count()를 통해서 그 숫자를 알 수 있다.

'Python > airbnb 클론' 카테고리의 다른 글

raw_ids ,inline Admin, save()  (0) 2022.01.26
photo model  (0) 2022.01.26
Room admin, query_set 1  (0) 2022.01.24
(Review, Reservation , List, Conservation) model and admin  (0) 2022.01.24
room model, 다대다 일대다 관계  (0) 2022.01.23