generics.ListAPIView

김혁준·2023년 7월 5일
0

django

목록 보기
13/18

Django’s generic views are built off of those base views, and were developed as a shortcut for common usage patterns such as displaying the details of an object. They take certain common idioms and patterns found in view development and abstract them so that you can quickly write common views of data without having to repeat yourself.

django generic view는 apiview의 자식클래스이고, drf에서 빠르게 작업하도록 만든 숏컷이다!

그중에서 ListAPIView는 페이지네이션,필터링을 빠르게 다뤄주는 view이다!

1.페이지네이션,필터링 다루기

class UserDetailFollowView(generics.ListAPIView):
    pagination_class = UserFollowPagination
    serializer_class = UserSerializer
    queryset = User.objects.none()

유저가 팔로우한 유저 목록과 유저를 팔로우한 유저 목록을 페이지네이션으로 보여줄 예정이다. 따라서 페이지네이션 클래스를 지정해줘서 params,페이지당 오브젝트 개수를 정해준다. 그다음 프론트에 어떻게 데이터를 보내줄지 모양을 정하기 위해 시리얼라이저 클래스를 정해주었다. 쿼리셋은 유저의 팔로우 항목이므로 유저 모델을 썼고 기본값은 아무것도 없게 만들었다.

def my_followings(self):
        user = get_object_or_404(User, id=self.user_id)
        return user.followings.all()

def my_followers(self):
        user = get_object_or_404(User, id=self.user_id)
        return user.followers.all()

ListAPIView 안에 팔로워와 팔로잉 목록을 보여주는 함수를 만든다.

def get_queryset(self):
        query_types = {
            "0": self.my_followings,
            "1": self.my_followers,
        }
        query_key = self.request.GET.get("filter", None)
        queryset = query_types.get(query_key, self.my_followings)()
        return queryset
        

쿼리파라미터 값이 "0"이면 팔로잉을 보여주고 "1"이면 팔로워를 보여주게 설정하고 프론트로부터 0또는 1을 받도록 쿼리셋을 얻는 함수를 작성했다.

   def get(self, request, *args, **kwargs):
        self.user_id = kwargs.get("user_id", None)
        return super().get(request, *args, **kwargs)

마지막으로 위의 함수를 통해 반환된 값을 바탕으로 프론트로 뿌려주는 역할을 하는 get함수를 만들었다.

*페이지네이션은 페이지네이션 클래스에서 정의한 query param을 바탕으로 정보를 얻는다.

from rest_framework.pagination import PageNumberPagination
class UserFollowPagination(PageNumberPagination):
    page_size = 10
    page_query_param = "follow_page"
    max_page_size = 100
    

(+프론트에서 get요청할때 넣는값)

async function getUserFollowList(currentFollowPage = 1, filter = 0) {
	await checkTokenExp();
	let token = localStorage.getItem("access");
	const userId = new URLSearchParams(window.location.search).get("user_id");
	const response = await fetch(
		`${BACKEND_BASE_URL}/users/${userId}/follow/?follow_page=${currentFollowPage}&filter=${filter}`,
		{
			headers: await getHeader((json = false)),
			method: "GET"
		}
	);
	return response;
}

apiView에 요청할때와 비슷하지만 페이지네이션 클래스에서 정의한 query_param인 follow_page, ListAPIView에서 정의한 filter(0이면 팔로잉 1이면 팔로워)를 추가해서 요청을 보내면 이에 해당하는 데이터를 전달받는다.

profile
스프링 개발자 지망생입니다

0개의 댓글