초보 개발자

Room admin, query_set 1 본문

Python/airbnb 클론

Room admin, query_set 1

taehyeki 2022. 1. 24. 17:45

room.admin.py

room admin을 좀 바꿔보려고한다. 

list_display를 사용하여 간단히 정보를 볼 수 있도록 하였고,

list_filter를 사용하여 조건에 맞는 정보만 볼 수 있도록 하였다.

search_fields를 사용하여 조건에 맞는 걸 검색 할 수 있는데 =city는 만약 city가 seoul이라면 seoul혹은 Seoul,SEOUL이런식으로 대소문자 구분 없이 일치해야 한다.  ^city라면 startswith옵션으로 seo Seo SEO이런식으로 적으면 seoul에 해당하는 방들이 나온다.

 

여기서 host는 room의 field명인데 foreign key로 구성되어있다. 언더바 2개 __를 사용하면 그 fk에서 정보를 가져올 수 있다. 따라서 user_name이 taehyeki라면 tae Tae TAE만 적어도 해당하는 방들이 검색이 된다.

 

filter에도 host__superhost인지 유무를 적어 방의 주인이 superhost인지 아닌지를 통해 가져왔다.

 

filter_horizontal은 many to many 인 경우에만 사용이 가능하다.

amenity와 house_rule, facility는 many to many로 이루어져있다. 따라서 저렇게 사용하면

이런식으로 멋지게 탈바꿈 가능하다.

 

우리는 좀 더 깔끔하게 room admin을 만들어 보려고한다. fieldsets을 활용하여 구획을 나누고 그에 해당하는 필드만 넣어주었다. filedsets은 튜플로 이루어져있고 그 안에 튜플들로 이루어져있다. 그리고 그 튜플 안에는 첫번째인자로 이름, 두번째 인자로 딕셔너리가 오면서 필드들을 집어넣을 수 있다.

 

classes에 cllapse를 넣으면 접었다 폈다할 수 있는 숨기기 기능이 생긴다.

여기서 튜플형식으로 맞춰줘야하기때문에 만약 인자가 한개라면 반드시 아래와 같이 콤마를 적어주어야 한다.

amenity의 갯수를 필드에 추가하여 보고주고 싶다. 따라서 list_display에 추가하고 실행시키면 아래와 같은 오류가 발생한다.

ManyToManyField는 못온다고 한다. 따라서 이를 숫자로 바꿔줄 함수를 만들겠다. 같은 어드민 안에 만들어 줄 것이다.

admin에 있는 함수들은 두가지를 가진다. 첫번째 인자에는 self가 들어오고 이건 현재 불리는 class 즉 RoomAdmin class를 의미한다. 두번째 인자에는 obj가 들어오고 이건 data의 각 행을 의미한다.

 

아래와 같은 함수를 만들고 

list_display에 함수 이름을 적어주면

그 필드에는 함수 이름이 들어오고 각 행에는 함수가 실행된 return값을 넣어주는 것을 확인할 수가 있다.

함수명.short_description

만약 함수의 이름이 아닌 다른 값을 필드에 넣고싶다면 short_description을 넣어주면 된다.

 

그럼 다음과 같이 변한 것을 확인할 수 있다.

obj에는 각 행이 온다고 했다. 그럼 그 행(room)의 baths를 출력하면 저 함수가 한번실행되는 것이 아닌

room의 갯수만큼 실행이 되고 그 리턴값이 count_amenities의 필드명으로 들어간다.

따라서 amenities를 구하기 위해서 먼저 접근해보자 obj.amenities만 적으면 아래와 같은 화면이 나오지만

obj.amenities.all()

all()까지 적어주면 queryset에 잘 담겨져 출력이 되는 것을 확인할 수 있다.

obj.amenities.count()

위에 것은 2개 아래것은 1개가 담겨있는 것을 확인할 수 있다. count()를 사용하면 숫자가 반환이되고 이걸 return값에 넣으면

해당하는 행의 어메니티의 갯수가 잘 출력이 되는 것을 확인할 수 있다.

 

manager and queryset

python manage.py shell 쉘을 켜고 from users.models import User 을 친 다음 User.objects를 치면 다음과 같은 화면이 출력된다.

UserManager라는 것이다. 이건 우리가 데이터베이스로부터 elements를 가져오게 해주는 것이다. 파이썬을 이용해서 sql을 사용하지 않고서 말이다. 이게 장고의 가장 멋진 부분 중 하나이다.

 

예를들어 모든 User을 얻고 싶으면 manager에게 말해야된다. manager은 여기 objects안에 살고있다.

User.objects.all()

User의 모든 데이터를 보여준다. 근데 QuerySet을 리턴한다. 

이건 Object리스트이다. QuerySet은 똑똑하기에 여러 명령을 수행할 수 있다.

User.objects.all().filter()

User.objects.get(), vars

vars는 해당 객체 안의 정보를 나열해준다.

dir()

이걸 확인해보면 hi라는 유저는 다양한 set을 가지고 있다.

room_set은 room에는 host가 있다. 이건 user를 foreign key로 두는 것이다. 전에 room.host.name처럼 접근하는 방법을 배웠던 적이 있다. 반대로 이번에는 room_set을 통해서 user에서 자신이 연결된 room에 접근하는 방법을 배워보자.

특정user.room_set.all()

hi라는 유저에 연결된 room의 모든 방이 보여진다.

우리는 User에서 set같은건 만들지 않았다. set은 장고가 알아서 만든 것이다. room에서 foreign key를 User로 가리키게 만든 것 뿐이다. 

 

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

photo model  (0) 2022.01.26
queryset , manytomany  (0) 2022.01.25
(Review, Reservation , List, Conservation) model and admin  (0) 2022.01.24
room model, 다대다 일대다 관계  (0) 2022.01.23
User admin패널 활용 및 User Model 완성  (0) 2022.01.23