Simo Siren
Simo Siren

Reputation: 51

How to use query params to filter objects in DRF?

I try to query a Course by its own field "name" instead of pk. And what should be the path when querying this?

All basic Cruds and query by pk works fine with this code.

Here I have all related files attached:

models.py

from django.db import models

# Teacher = opettaja in Finnish
class Opettaja(models.Model):
    nimi = models.CharField(max_length=100, default='')
    puhelin = models.CharField(max_length=20, default='')

    class Meta:
        ordering = ['nimi']

# Course = kurssi in Finnish
class Kurssi(models.Model):
    nimi = models.CharField(max_length=100, default='')
    laajuus = models.IntegerField()
    opettaja = models.ForeignKey(Opettaja, on_delete=models.CASCADE)

    class Meta:
        ordering = ['nimi']

serializers.py

from rest_framework import serializers
from .models import Opettaja, Kurssi

class OpettajaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Opettaja
        fields = ['id', 'nimi', 'puhelin']

class KurssiSerializer(serializers.ModelSerializer):
    class Meta:
        model = Kurssi
        fields = ['id', 'nimi', 'laajuus', 'opettaja']

urls.py

from django.urls import include,path
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r"opettaja", views.OpettajaViewSet)
router.register(r"kurssi", views.KurssiViewSet, "nimi")

# My app is simply named as app in this project
urlpatterns = [
    path("api/", include((router.urls, "app"))),
]

views.py

from rest_framework import viewsets from .models import Opettaja, Kurssi from .serializers import OpettajaSerializer, KurssiSerializer

class OpettajaViewSet(viewsets.ModelViewSet):
    queryset = Opettaja.objects.all()
    serializer_class = OpettajaSerializer

class KurssiViewSet(viewsets.ModelViewSet):
    queryset = Kurssi.objects.all()
    serializer_class = KurssiSerializer
    def get_queryset(self):
        queryset = Kurssi.objects.all()
        nimi = self.request.query_params.get("nimi")
        if nimi is not None:
            nimi = nimi
        return queryset

I try to query a Course by its own field "name" instead of pk. And what should be the path when querying this?

Upvotes: 1

Views: 3318

Answers (1)

Sumithran
Sumithran

Reputation: 6555

Give this a try

def get_queryset(self):
    queryset = Kurssi.objects.all()
    nimi = self.request.query_params.get("nimi")
    if nimi is not None:
        queryset = queryset.filter(nimi=nimi)
    return queryset

You don't have to change the URLs path for this, the URL should be something like

api/kurssi?nimi=some_name

Upvotes: 3

Related Questions