我有一个类似的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()),
}
我可以在网址中传递日期,但推荐日期范围的方法是什么?
答案 0 :(得分:1)
我要做的是将范围移至start
和end
查询参数,而不是将其保留为休息式网址格式。
这会将您的网址修改为
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()),
}