Filtering against query parameters, Many to many

Viewed 212

I want to filtering against query parameters in the URL by id.

For example: http://.../game/?category=1&level=1. Here are some pieces of my code:


models.py

class Game(models.Model):
    name = models.CharField(max_length=100) 
    category = models.ForeignKey(Categories, on_delete=models.CASCADE)
    level = models.ManyToManyField(Level)

views.py

class GamesListView(generics.ListAPIView):
    serializer_class = GamesListSerializer

    def get_queryset(self):
        queryset = Games.objects.all()
        category = self.request.query_params.get('category')
        level = self.request.query_params.get('level')

        if category:
            queryset = queryset.filter(category_id=category)

How to filter the levels that are related by the relationship many to many with game?

1 Answers

You can filter with level=id_of_level, or you can use level__id=id_of_level as well. SO you can implement this with:

class GamesListView(generics.ListAPIView):
    serializer_class = GamesListSerializer

    def get_queryset(self):
        queryset = Games.objects.all()
        category = self.request.query_params.get('category')
        level = self.request.query_params.get('level')

        if category:
            queryset = queryset.filter(category_id=category)
        if level:
            queryset = queryset.filter(level=level)
        return queryset
Related