이전에 작성한 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')
파라미터로 username을 전달하면 해당 유저의 profile status만 리턴한다.
Profile에 포함된 city를 기준으로 search filter를 적용해 보자.
이를 위해, 기존의 코드에서 아래 사항을 적용하여 변경한다.
[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"]
search=city명을 입력하면 필터링되어 데이터가 뿌려짐을 알 수 있다.
이 때 굳이 city명을 다 입력하지 않고 일부만 입력하더라도 검색이 된다.
가령, seoul로 검색할 때, se만 입력하더라도 검색이 된다.