在Django Rest中传递URL中的日期范围

时间:2017-12-26 14:01:09

标签: python json django python-3.x

我有一个类似的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 Framework。每当我发出GET请求时,localhost/namelist/{{name}}/都会返回"name": "ab"所在的JSON。

现在,我想根据日期范围返回JSON。我将在url中传递开始日期和结束日期,并且应该返回该特定日期范围内的值,应该忽略时间。此外,我们还要考虑几个月,而不仅仅是日期。在这个例子中,月份是相同的,但在实际情况下,月份可能会有所不同。比如,localhost/namelist/{{name}}/{{start_date}}/{{end_date}}/

如果网址为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()),

}

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

3 个答案:

答案 0 :(得分:1)

我要做的是将范围移至startend查询参数,而不是将其保留为休息式网址格式。

这会将您的网址修改为

    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字段查找

这会要求您将网址移至

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

答案 1 :(得分:0)

您可以按如下方式定义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,因为您的字段被称为&#39; date&#39; (尽管它是一个&#39; datetime&#39;,而不是&#39; date&#39;)
  • date__date因为我们想要cast the 'datetime' into a 'date'
  • date__date__range,因为我们将按date range
  • 进行过滤

修改此解决方案假设您始终希望按日期范围进行过滤;如果您未在网址中提供开始日期和结束日期,则会产生404错误。如果您希望选择按日期范围进行过滤,则应使用Jason's answer,或查看DRF's filtering section

答案 2 :(得分:0)

这是最简单的一个,

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()),

}