DRF 12 - Filtering

Joey Lee·2020년 7월 13일
3

Django REST Framework

목록 보기
14/16

1. Filtering 적용하기

1) 코드 작성

이전에 작성한 ProfileStatusViewSet 는 전체 리스트를 다 뿌려주는 코드였다. 이제는 전체도 보여주지만, username이 parameter로 전달될 때는 해당 username의 profile status만 보여지도록 코드를 수정해 보자.

이를 위해 get_queryset를 아래와 같이 override하여 작성하여야 한다. 그리고 원래 class 바로 밑에 있었던 queryset = ProfileStatus.objects.all()get_queryset 아래에 위치시킨다.

[views.py]

class ProfileStatusViewSet(ModelViewSet):
    serializer_class = ProfileStatusSerializer
    permission_classes = [IsAuthenticated, IsOwnerOrReadOnly]

    def get_queryset(self):
        queryset = ProfileStatus.objects.all()
        username = self.request.query_params.get("username", None)
        if username is not None:
            queryset = queryset.filter(user_profile__user__username=username)
        return queryset

    def perform_create(self, serializer):
        user_profile = self.request.user.profile
        serializer.save(user_profile=user_profile)

urls.py는 아래와 같이 수정해 준다. basename='status'를 추가해 준 점에 주목하자. 이유는 확인해 봐야 되지만, 이 설정을 바꿔주지 않으면 에러가 발생한다.

[urls.py]

router.register(r"status", ProfileStatusViewSet, basename='status')

2) 테스트 결과

파라미터로 username을 전달하면 해당 유저의 profile status만 리턴한다.

2. Search Filter 적용하기

1) 코드 작성

Profile에 포함된 city를 기준으로 search filter를 적용해 보자.

이를 위해, 기존의 코드에서 아래 사항을 적용하여 변경한다.

  • SearchFilter를 임포트
  • filter_backends를 설정
  • search_fields를 명시

[views.py]

from rest_framework.filters import SearchFilter

class  ProfileViewSet(mixins.UpdateModelMixin, 
                        mixins.ListModelMixin, 
                        mixins.RetrieveModelMixin,
                        viewsets.GenericViewSet):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    permission_classes = [IsAuthenticated, IsOwnProfileOrReadOnly]
    filter_backends = [SearchFilter]
    search_fields = ["city"]

2) 테스트 결과

search=city명을 입력하면 필터링되어 데이터가 뿌려짐을 알 수 있다.
이 때 굳이 city명을 다 입력하지 않고 일부만 입력하더라도 검색이 된다.
가령, seoul로 검색할 때, se만 입력하더라도 검색이 된다.

profile
안녕하세요!

0개의 댓글