일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- wetube
- EC2
- Props
- node
- 중급파이썬
- socket io
- SAA
- 채팅
- crud
- Vue
- git
- 카톡
- merge
- AWS
- SSA
- lambda
- flask
- async
- TypeScript
- RDS
- dict
- NeXT
- Class
- pandas
- 튜플
- MongoDB
- S3
- docker
- react
- 파이썬
- Today
- Total
초보 개발자
Room admin, query_set 1 본문
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 |