【问题标题】:Django page not found when passing date超过日期时找不到 Django 页面
【发布时间】:2024-05-21 04:10:02
【问题描述】:

我正在使用 django rest 框架 (DRF) 构建 django 应用程序。我有 DateField 类型的模型,我想根据 yyyy-mm-dd 格式的日期进行查询,例如http://127.0.0.1:8000/dataharian/2021-08-09/。我使用了here 中提到的路径转换器 进行一些调整,使 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

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 是印尼语的日期

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

【问题讨论】:

    标签: python django django-rest-framework django-views


    【解决方案1】:

    默认情况下,APIViews 基于字段pk 进行查找。要覆盖它,DataHarianDetail 需要设置lookup_field

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

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

    【讨论】:

    • 您好,感谢您的回复。我设计了一个记录只保存单个日期(tanggal)。您的解决方案适用于我的情况。那么下次我需要指定lookup_field 以完成URL 请求吗?非常感谢您的回复