首页 > 解决方案 > 超过日期时找不到 Django 页面

问题描述

我正在使用 django rest 框架(DRF)构建 django 应用程序。我有 DateField 类型的模型,我想根据 yyyy-mm-dd 格式的日期进行查询,例如http://127.0.0.1:8000/dataharian/2021-08-09/我使用了此处提到的路径转换器并 进行了一些调整,以便 URL 能够接受 yyyy-mm-dd 格式。这是 DataHarian 模型、DataHarian 视图、转换器和 URL.py 文件

DataHarian 模型:

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 视图:

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

转换器:从日期时间导入日期时间

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

网址.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()),]

* Tangal 是印尼语的日期

如果我的解释不够好,请给予反馈 谢谢您的回复

标签: pythondjangodjango-rest-frameworkdjango-views

解决方案


默认情况下,APIViews 基于 field 进行查找pk。要覆盖这一点,DataHarianDetail 需要lookup_field设置:

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

但是,如果多条记录可以共享相同的日期,您将遇到问题。当有多个匹配项时,API 将抛出错误。


推荐阅读