Search code examples
pythondjangodjango-rest-frameworkdjango-querysetquery-string

How to use Query Strings for filtering Querysets in Django?


I created my "API" using REST framework, now I am trying to do filtering for it.

This is how my models.py looks like:

class Airline(models.Model):
    name = models.TextField()

class Workspace(models.Model):
    airline = models.ForeignKey(Airline)
    name = models.CharField(max_length=100)

class Passenger(models.Model):
    workspace = models.ForeignKey(Workspace)
    title = models.CharField(max_length=200)

I would like to see "all passengers in particular workspace" or "all passengers in particular airline" etc in my JSON file.

Here is my serializers.py:

class AirlineSerializer(serializers.ModelSerializer):
    class Meta:
        model = Airline


class WorkspaceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Workspace


class PassengerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Passenger

And views.py:

class AirlineList(generics.ListCreateAPIView):
    model = Airline
    serializer_class = AirlineSerializer


class AirlineDetail(generics.RetrieveUpdateDestroyAPIView):
    model = Airline
    serializer_class = AirlineSerializer


class WorkspaceList(generics.ListCreateAPIView):
    model = Workspace
    serializer_class = WorkspaceSerializer


class WorkspaceDetail(generics.RetrieveUpdateDestroyAPIView):
    model = Workspace
    serializer_class = WorkspaceSerializer


class PassengerList(generics.ListCreateAPIView):
    model = Passenger
    serializer_class = PassengerSerializer


class PassengerDetail(generics.RetrieveUpdateDestroyAPIView):
    model = Passenger
    serializer_class = PassengerSerializer

I would like to use Filtering against query parameter but I can't really get it...


Solution

  • Here is the code:

    class PassengerList(generics.ListCreateAPIView):
        model = Passenger
        serializer_class = PassengerSerializer
    
        # Show all of the PASSENGERS in particular WORKSPACE
        # or all of the PASSENGERS in particular AIRLINE
        def get_queryset(self):
            queryset = Passenger.objects.all()
            workspace = self.request.query_params.get('workspace')
            airline = self.request.query_params.get('airline')
    
            if workspace:
                queryset = queryset.filter(workspace_id=workspace)
            elif airline:
                queryset = queryset.filter(workspace__airline_id=airline)
    
            return queryset