【问题标题】:Pass date range in URL in Django Rest在 Django Rest 中的 URL 中传递日期范围
【发布时间】:2018-06-07 08:36:48
【问题描述】:

我有一个类似的 JSON 结构,

[
    {

        "date": "2017-12-17 06:26:53",
        "name": "ab",

    },

    {

        "date": "2017-12-20 03:26:53",
        "name": "ab"

    },

   {

        "date": "2017-12-18 04:26:53",
        "name": "ab"

    },

    {

        "date": "2017-12-19 05:26:53",
        "name": "ab"

    }
]

我正在使用 Django Rest 框架。每当我向localhost/namelist/{{name}}/ 发出GET 请求时,它会返回"name": "ab" 所在的JSON。

现在,我想根据日期范围返回 JSON。我将在 url 中传递开始日期和结束日期,它应该返回该特定日期范围内的值,时间应该被忽略。此外,我们还必须考虑月份,而不仅仅是日期。在此示例中,月份是相同的,但在实际场景中,月份可能不同。喜欢,localhost/namelist/{{name}}/{{start_date}}/{{end_date}}/

如果 URL 是,localhost/namelist/abcd/2017-12-17/2017-12-19/,那么它应该返回,

 [
        {

            "date": "2017-12-17 06:26:53",
            "name": "ab",

        },

       {

            "date": "2017-12-18 04:26:53",
            "name": "ab"

        },

        {

            "date": "2017-12-19 05:26:53",
            "name": "ab"

        }
    ]

views.py :-

def get_queryset(self):

    param = self.kwargs.get('pk')
    param2 = self.kwargs.get('ak')
    return namelist.objects.filter(name=param, date = param2)

urls.py :-

urlpatterns = {

    url('^namelist/(?P<pk>[\w\-]+)/(?P<ak>[\w\-]+)/$', ListViewParam.as_view()),

}

我可以在 URL 中传递日期,但是传递日期范围的推荐方法是什么?

【问题讨论】:

    标签: python json django python-3.x


    【解决方案1】:

    您可以如下定义 URL 参数:

    urlpatterns = {
    
        url('^namelist/(?P<pk>[\w\-]+)/
                       (?P<start_date>\d{4}-\d{2}-\d{2})/
                       (?P<end_date>\d{4}-\d{2}-\d{2})$', ListViewParam.as_view()),
    
    }
    

    然后在你看来:

    def get_queryset(self):
    
        param = self.kwargs.get('pk')
        start_date = self.kwargs.get('start_date')
        end_date = self.kwargs.get('end_date')
        return namelist.objects.filter(name=param, date__date__range=(start_date, end_date))
    

    看起来很奇怪,但这是您要过滤的内容:

    • date,因为您的字段被称为“日期”(虽然它是“日期时间”,而不是“日期”)
    • date__date 因为我们想cast the 'datetime' into a 'date'
    • date__date__range,因为我们将按 date range 过滤

    edit 此解决方案假定您将始终希望按日期范围进行过滤;如果您没有在 URL 中同时提供开始日期和结束日期,则会产生 404 错误。如果您想允许按日期范围进行选择性过滤,您应该使用Jason's answer,或查看DRF's filtering section

    【讨论】:

      【解决方案2】:

      这个是最简单的,

      views.py :-

      def get_queryset(self):
      
          param = self.kwargs.get('pk')
          param2 = self.kwargs.get('sk')
          param3 = self.kwargs.get('ek')
          return namelist.objects.filter(name=param, date__gte = param2, date__lte = param3)
      

      urls.py :-

      urlpatterns = {
      
          url('^namelist/(?P<pk>[\w\-\.]+)/(?P<sk>[\w\-\.]+)/(?P<ek>[\w\-\.]+)/$', ListViewParam.as_view()),
      
      }
      

      【讨论】:

        【解决方案3】:

        我要做的是将范围移动到startend 查询参数,而不是将它们保持为rest-style URL 格式。

        这会将您的网址修改为

            url('^namelist/(?P<pk>[\w\-]+)/$', ListViewParam.as_view()),
        

        和你对

        的看法
        def queryset(self):
            name = self.kwargs.get('ak', None)
            start = self.query_params.get('start', None)
            end = self.query_params.get('end', None)
            return namelist.objects.filter(name = name, date__range(start, end))
        

        利用range 字段查找

        这需要您将 URL 移动到类似

        的位置
        localhost/namelist/abcd/?start=2017-12-17&end=2017-12-19
        

        【讨论】:

          猜你喜欢
          • 2020-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-09
          • 1970-01-01
          • 1970-01-01
          • 2018-07-15
          • 1970-01-01
          相关资源
          最近更新 更多