- TIL. AI 팀프로젝트(5) listapiview 쿼리 처리 목차
[오늘 한일]
- 프로젝트 진행
[오늘 배운점]
오늘은 구글연동 로그인이 프로젝트에 적용되었다.
이 부분에 대해서는 차후에 다시 공부해봐야겠다.
오늘은 게시글 동작에 관련해 바뀐 기능을 점검해보면서 배운점을 적어본다.
<view 쿼리셋 처리>
지난 프로젝트때 아쉬웠던 부분으로써, 이부분을 개선하기로 처음부터 계획했었다.
게시글 목록조회 부분이다.
게시글 목록조회에는 페이지네이션을 적용한다.
그리고 이런 목록조회가 4가지 형태가 필요하다.(최신글, 트렌딩, 북마크, 작성자이다.)
우리는 view가 불필요하게 나눠지지 않게 유의했으며,
더 나아가 4유형의 글 목록조회를 하나로 묶어 처리했다.
한 url, 한view로의 요청이 쿼리스트링으로 구분되어
filter인자로는 목록유형을,
page인자로는 페이지네이션 처리를,
추가로 user_id인자로 작성자 정보를 처리한다.
개괄은 위와 같다. 이제 코드를 보자면
class ArticleView(generics.ListCreateAPIView):
(중략)
queryset = Article.objects.all().order_by("-created_at")
def trending(self):
(중략)
return queryset
def bookmarked(self):
(중략)
return queryset
def of_user(self):
(중략)
return user.article_set.all().order_by("-created_at")
def get_queryset(self):
(중략)
query_select = {
"trending": self.trending,
"bookmarked": self.bookmarked,
"user": self.of_user,
}
selection = self.request.GET.get("filter", None)
return query_select.get(selection, super().get_queryset)()
팀원분이 작성하신 내용은 이렇다.
쿼리문을 인식해서 위처럼 4가지를 (trending, bookmarked, user, 그리고 기본인 None(최신순)이다.) 처리한다.
generic.ListAPIview나 ListCreateAPIView는 get메소드를 포함하고 있다.
get요청을 받을시 리스트형태(다수 데이터)를 제공하는 역할을 한다.
보통 상단에 있는것 처럼 queryset을 지정하고,
pagination클래스, permission클래스 등을 지정하는 것으로 작성을 마친다.
그러면 내포되어있는 쿼리셋 메소드가 동작해서 쿼리셋을 작성하고,
해당 쿼리셋을 사용자에게 반환한다.
이번에는 위 적은 목적을 위해 더욱 커스텀을 했다.
get_queryset을 오버라이딩 하여 query_select라는 변수명으로 딕셔너리를 만들었다.
그리고 request.get에서 filter 인자를 추출하고
가져온 filter인자를 이용해 3가지 메서드를 실행시킨다.
get_queryset의 반환값은 쿼리셋이 되야한다.
그래서 위의 3가지 메서드는 각자 자기에 맞는 쿼리셋을 반환해준다.
그걸 다시 get_queryset이 반환하는 걸 볼수있다.
그리고 기본 쿼리셋을 한차례 실행해서 (최신순 정렬이 기본에 있다.)
get연산 두번째 인자에 실려있다.
이건 딕셔너리 get연산에 기본값을 준것으로,
filter인자에 해당하는 키를 딕셔너리에서 못찾으면 기본값인 최신순이 동작하게 한것이다.
이것으로 기본형에 대한 제공과, 예외에 대한 대비도 완성했다.
※ 지난 프로젝트때의 북마크 게시글 조회에 사용한 작성법을,
더 보강했다고 볼수있다.
※ 그리고 비교 케이스로 이번 프로젝트의 코멘트 조회가 있다.
코멘트 역시 리스팅과 페이지 네이션이 필요한데,
쿼리셋 처리를 또 다르게 처리했다.
view에 쿼리셋 지정을 none으로 하고 get메소드를 열어서 그안에서 쿼리셋을 작성하고 지정한다.
그리고 본래의 get으로 반환을 처리하는 식으로 작성했다.
이렇게도 잘 동작한다.
※ 백엔드에 맞춰 js에서도 filter쿼리문을 넘겨야 한다.
당연하지만, 프론트 페이지 주소보다,
api를 요청하는 url에 쿼리문이 추가되는게 중요하다.
page, filter, user_id등 여러개 쿼리문을 나열하기 위해서는
?뒤에 &로 이어붙여준다.
?page=1&filter=trending 이런식이다.
js함수가 동작할때, 인자로 파라미터 값을 받을수 있다.
(프론트 함수가 분리되있다면 이런 처리가 필요없고, 해당 함수의 요청 url만 바꾼다.)
(하지만 해당 함수도 묶고싶다면 이런 인자가 필요하다.)
이때 특징은 인자가 입력되지 않은 경우, js함수는 해당인자를
undefined로 정의하며 함수를 처리해준다.
파이썬은 에러를 상세히 알려주고, js는 왠만하면 실행시켜준다는 말이 이런뜻인거 같다.
마치 파이썬에서 파라미터에 =none을 부여하는 것처럼,
인자 유무에 따라 다르게 반응하는 함수를 작성해줄수 있다.
결론, 장고에 ListAPIView에 get_queryset을 잘 익히게 됬다.
그러면서 함수 딕셔너리와, 딕셔너리 연산도 다시 한번 복습하게 되었다.