我有我的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_)
答案 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;;