如何从网址只传递一年到视图

时间:2017-04-04 07:49:31

标签: python regex django url view

我有我的django应用程序,我想从网址传递到格式的年份,例如:2017-18。 下面我收到一个错误,我的日期必须是日期格式 - YYYY-MM-DD。

这是我的网址:

url(r'^(?P<branch_slug>/production/(?P<year1>[0-9]{4})-(?P<year2>[0-9]{2})$', Events.as_view()),

以下是我的观点:

def get_queryset(self):
    season = Events.objects.get(start=self.kwargs['year1'], end=self.kwargs['year2'])
    filter_['start__gte'] = season.start
    filter_['start__lte'] = season.end
    return self.model.objects.filter(**filter_)

4 个答案:

答案 0 :(得分:2)

Event对象的start和end属性可能是datetime.date实例(如果您使用的是DateField)。因此,您需要在视图中使用它们之前将year1和year2变量从您的网址转换为日期。

some_date = datetime.date(YYYY, 1, 1)

答案 1 :(得分:2)

你原来的问题和其他人的问题。这里的答案,匹配从year1的1月1日开始到year2的12月31日结束的季节。我怀疑这不是你想要的,而是你想要一个在year1某个时间开始并在year2结束一段时间的季节,然后你想在这些日期之间查找事件。 / p>

Django使用__year=进行特殊查找,仅匹配日期的年份部分。有关详情,请参阅https://docs.djangoproject.com/en/1.10/ref/models/querysets/#year。您需要将输入值转换为日期才能使用此功能;它适用于整数。

def get_queryset(self):
    # Get a season starting any time in year1 and ending in year2
    season = Events.objects.get(
        start__year=int(self.kwargs['year1']),
        end__year=int(self.kwargs['year2']),
    )

与其他人评论一样,您应该更改URL正则表达式以匹配4位数年份,以避免歧义。

url(r'^(?P<branch_slug>/production/(?P<year1>[0-9]{4})-(?P<year2>[0-9]{4})$', Events.as_view()),

答案 2 :(得分:0)

正如@dentemm指出的那样,要对日期时间字段strings representing date must be converted to datetime objects进行过滤。我的建议是use datetime field。传递年份字符串,然后在视图中将日期字符串转换为日期时间对象以进行过滤

import datetime
def get_queryset(self):
    start=datetime.strptime('1-1-'+self.kwargs['year1'], '%m-%d-%Y')
    end=datetime.strptime('12-31-'+self.kwargs['year2'], '%m-%d-%Y')
    season = Events.objects.get(start=start, end=end)
    filter_['start__gte'] = season.start
    filter_['start__lte'] = season.end
    return self.model.objects.filter(**filter_)

datetime.strptime('1-1-'+self.kwargs['year1'], '%m-%d-%Y')将为开始日期创建日期时间对象,日期为给定开始日期字符串的1月1日,datetime.strptime('12-31-'+self.kwargs['year2'], '%m-%d-%Y')将为结束日期创建日期时间对象,日期为给定结束日期字符串的12月31日。要确保查询返回在结束日期内创建的所有对象,您可以执行类似

的操作
`end_date = datetime.strptime('31-12-'+self.kwargs['year1']+'T23:59:59.999999', '%m-%d-%YT%H:%M:%S.%f')` 

@Alasdair在其中一条评论change (?P<year2>[0-9]{2}) to (?P<year2>[0-9]{4})中提出要接受来自网址的4位数年份字符串

答案 3 :(得分:0)

如果模型中有日期时间/日期字段,请使用Django中的年份查找: https://docs.djangoproject.com/en/1.10/ref/models/querysets/#year

正如它所说:

Entry.objects.filter(pub_date__year = 2005)

在sql中等于:

SELECT ... WHERE pub_date BETWEEN&#39; 2005-01-01&#39; AND&#39; 2005-12-31&#39;;