DEV Community 👩‍💻👨‍💻

Serhat Teker
Serhat Teker

Posted on • Originally published at tech.serhatteker.com on

How to filter your query with params in Django Rest - Part I

Intro

Let's assume that I have an endpoint like below, linked to
usual generics.ListCreateAPIView:

  • /api/articles/ - GET, POST
# articles/views.py
from rest_framework import generics

from src.articles.models import Article
from src.articles.serializer import ArticleSerializer


class ArticleListView(generics.ListCreateAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
Enter fullscreen mode Exit fullscreen mode

As you may already know you can fetch all articles via GET and post a new article via POST with required data in the body.

OK, the question is how can I filter articles against queryset parameters? Like;

Solution

The default behavior of REST framework's generic list views is to return the entire queryset for a model manager. We should overwrite the default get_queryset method;

# articles/views.py
from rest_framework import generics

from src.articles.models import Article
from src.articles.serializer import ArticleSerializer


class ArticleListView(generics.ListCreateAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    region_separator = ","

    def get_queryset(self):
        """
        Optionally restricts the returned articles to given regions,
        by filtering against a `regions` query parameter in the URL.
        """
        regions = self.request.query_params.get("regions", None)
        if regions:
            qs = Article.objects.filter()
            for region in regions.split(self.region_separator):
                qs = qs.filter(regions__code=region)

            return qs

        return super().get_queryset()
Enter fullscreen mode Exit fullscreen mode

It filters articles when regions query param provided, when there is no param it returns all articles.

All done!

Top comments (0)

Stop sifting through your feed.

Find the content you want to see.

Change your feed algorithm by adjusting your experience level and give weights to the tags you follow.