Django page not found when passing date

Viewed 49

I'm building django app with django rest framework (DRF). I have model with DateField type and I want to query based on date in yyyy-mm-dd format for example http://127.0.0.1:8000/dataharian/2021-08-09/. I used the path converter as mentioned here with some adjustments so the URL able to accepts yyyy-mm-dd format. Here is the DataHarian model, DataHarian view, the converter, and the URL.py file

DataHarian model:

class DataHarian(models.Model):
    tanggal = models.DateField(blank=False, null=False)
    kumulatif = models.IntegerField(default=0)
    sembuh = models.IntegerField(default=0)
    dalam_perawatan = models.IntegerField(default=0)
    meninggal = models.IntegerField(default=0)

    def __str__(self):
        return str(self.tanggal)

DataHarian view:

class DataHarianDetail(generics.RetrieveAPIView):
    queryset = DataHarian.objects.all()
    serializer_class = DataHarianSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

Converter : from datetime import datetime

class TanggalConverter:
    regex = '\d{4}-\d{2}-\d{2}'

    def to_python(self, value):
        return datetime.strptime(value, '%Y-%m-%d')

    def to_url(self, value):
        return value

URL.py

from django.urls import path, register_converter
from datetime import datetime
from . import views, converters

register_converter(converters.TanggalConverter, 'yyyy-mm-dd')

urlpatterns = [path('dataharian/<yyyy-mm-dd:tanggal>', views.DataHarianDetail.as_view()),]

*Tanggal is date in Indonesian

If my explanation isn't good enough, please give a feedback Thank you for your response

1 Answers

By default, APIViews do lookups based on the field pk. To override this, DataHarianDetail needs lookup_field set:

class DataHarianDetail(generics.RetrieveAPIView):
    lookup_field = 'tanggal'
    queryset = DataHarian.objects.all()
    serializer_class = DataHarianSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

However, you're going to run into problems if multiple records can share the same date. The API will throw an error when there are multiple matches.

Related