Reputation: 51
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
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