Michaela
Michaela

Reputation: 339

How to do filtering according to log in user?

I want to get hobbys according to log in user but I am always getting TypeError at /backend/api/hobbys/ init() takes 1 positional argument but 2 were given

this is my views.py

class ListCreateHobbyView(GenericAPIView):
    queryset = Hobby.objects.all()
    serializer_class = HobbySerializer

     # Filtering by logged in user
    def get(self, request, *args, **kwargs):
        queryset = Hobby.objects.filter(user=request.user)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

What can be wrong?

Upvotes: 1

Views: 1291

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476803

Please do not override the entire .get(…) method. This means that (nearly) all boilerplate code that Django has written is no longer applied. You filter in the .get_queryset(…) method [drf-doc]:

from rest_framework.generics import ListAPIView

class ListCreateHobbyView(ListAPIView):
    queryset = Hobby.objects.all()
    serializer_class = HobbySerializer
    
    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            user=self.request.user
        )

You can also make a custom filter backend: this is a reusable component that you then can use in other views. This thus looks like:

from rest_framework import filters

class UserFilterBackend(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(user=request.user)

then you use this as filter backend:

from rest_framework.generics import ListAPIView

class ListCreateHobbyView(ListAPIView):
    queryset = Hobby.objects.all()
    serializer_class = HobbySerializer
    filter_backends = [UserFilterBackend]

The advantage of this approach is that if you later construct extra views that need the same filtering, you can simply "plug" these in.

Upvotes: 4

Related Questions