Methods
admins.py와 models.py 모두에 function을 정의할 수 있다.
만약 오직 관리자 페이지에서만 function을 사용할 것이라면, admins.py에 정의한다.
만약 관리자 페이지 뿐만 아니라 다른 곳에서도 사용할 것이라면, models.py에 정의한다.
Method 만들기
클래스 안에 있는 메서드는 항상 self를 첫번째 매개 변수로 받아야한다. 꼭 self라 할 필요는 없고, 단지 꼭 하나의 초기 매개 변수가 있으면 된다.
⭐'방 리뷰의 평균 보여주기' 메서드
우리의 Room 모델의 review 속성을 가지고 있지 않다. 하지만, review 모델이 room을 가리키므로 Room에서 그 방을 가리키는 모든 review들에 접근할 수 있다.
def rating(room):
count = room.reviews.count()
if count = 0:
return "No Reviews"
else:
total_rating = 0
for review in room.reviews.all().values("rating") #review의 rating만 필요하므로 rating만 불러오기
total_rating += review['rating']
return round(total_rating / count, 1)
Search Fields
Admin Actions
#admin.py
#admin 클래스 밖에
@admin.action(description="...")
def 함수명(액션을 호출하는 클래스, 요청한 user정보, 선택한 모든 객체의 리스트):
함수 작성
#admin 클래스 안에
actions = (action1,action2,...)
Custom Filters
●ForeignKey로도 필터링이 가능(user__is_host처럼 __로 가능, 외래키의 외래키의 외래키... 도 가능)
●직접 필터 만들기
필터 코드는 admins.py가 아니라 별도의 파일에 있어도 된다. 하지만 admins.py에 import는 해주고 Admin 클래스에 적어주어야한다.
class 필터명(admin.SimpleListFilter):
title = 어드민 패널에 뜨게할 이름
parameter_name = url에 사용될 이름
def lookup(self,request,model_admin):
return [("DB에서 사용될 이름","직접 보게되는 이름"), ....] #필터링할 것들
def queryset(self,request,queryset):
return 필터링 후에 리턴할 것
위의 예시 코드에서, queryset함수에 'request.GET'을 프린트하면 단어의 쿼리 딕셔너리 {'word':['good']}을 프린트한다.(어드민 패널에서 Good으로 필터링했을 때)
우리는 필터링 시에 Good만 필요하므로 'word = self.value()'를 해주는 것이다.
if word:에서 리턴되는 review는 queryset이므로, .filter 등을 쓸 수 있다. 여기서는 .filter를 통해 'word'가 포함되는 리뷰를 리턴한다.
'노마드 코더 Airbnb 클론 코딩' 카테고리의 다른 글
노마드 코더 에어비앤비 클론 코딩 #10 Django Rest Framework (1) | 2022.11.05 |
---|---|
노마드 코더 에어비앤비 클론 코딩 #9 Urls and Views (0) | 2022.10.26 |
노마드 코더 에어비앤비 클론 코딩 #7 ORM (0) | 2022.10.19 |
노마드 코더 에어비앤비 클론코딩 #6 Models and Admin (0) | 2022.10.17 |
노마드 코더 에어비앤비 클론코딩 #5 USERS APP (1) | 2022.10.13 |