본문으로 바로가기

 

과제 : get_queryset 해서 파라미터를 사용해서 필터 거치고 내가 들어간 회원의 판매물품만 들고와야한다.

 

class UserGoodsView(ModelViewSet):
    # queryset = Goods.objects.prefetch_related('like','goodsimage_set').select_related('seller', 'buyer').all()
    # queryset = Goods.objects.filter(seller_id=user_id, buyer_id=user_id)
    serializer_class = GoodsSerializer
    permission_classes = [IsAuthorOrReadOnly,]


    # def get_permissions(self):
    #     if self.action == 'create':
    #         return [permissions.IsAuthenticated(),] # ()를 붙이는 이유는 super의 get_permissions를 보면 알 수 있다.
    #     return super(GoodsView, self).get_permissions()


    def get_serializer_context(self):
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self,
            'action' : self.action
        }


    # def perform_create(self, serializer):
    #     serializer.save(seller_id = self.request.user.id)

    def get_queryset(self):

        # queryset2 = queryset.objects.filter(seller_id=self.kwargs['pk'])
        # goods=Goods.objects.all()
        # filter_goods=goods.filter(seller_id=self.kwargs['pk'])
        # print(goods)
        # print(filter_goods)
        return Goods.objects.prefetch_related('like','goodsimage_set').select_related('seller', 'buyer').all()


        # Goods.objects.filter(seller_id=user_id, buyer_id=user_id)
    def get_queryset(self):
        goods=Goods.objects.all()
        filter_goods=goods.filter(seller_id=self.kwargs['pk'])
        print(goods)
        print(filter_goods)
        return goods.filter(seller_id=self.kwargs['pk'])

공식문서 읽으면서 하나씩 작성해봤다.

문제 쿼리셋에서는 필터가 되어서 print에는 잘 찍히지만 포스트맨에서는 한개만 나온다. 분명 3개가 나오게끔 했는데 이유가 뭘까?

해결 전역변수로 전체 오브젝트를 가져오고 메소드 안에서 필터를 해서 생긴 오류인 것 같다. 메소드에서 파라미터 이용하면서 리턴해서 해결!

그러면 작성한 두개코드를 비교해봤다 결과가 다를까?? 위의 코드일때 아래 나옴


일때는 아래의 코드

prefetch_related('like','goodsimage_set').select_related('seller', 'buyer') 는 쿼리를 줄여주기 위해 사용한것 같다 좀 더 공식문서를 읽어보고 뷰셋을 사용해보도록 노력 할 것이다.