2017-02-23 82 views
0

我尝试为我的渲染创建一个范围,但当我使用now()date.today()按日期过滤时,我只有空查询。为什么日期范围返回空查询?

models.py:

class Episode(models.Model): 
    date = models.DateTimeField(null=True, default=now) 

我导入好的库的过程:

from django.utils.timezone import now, timedelta 

我认为这是个好办法:

page = 0 
n = now() 
Episode.objects.filter(date__range=[n-timedelta(days=(5*page)), n-timedelta(days=(5*(page+1)))]) 
<QuerySet []> 

但它没有工作... 有关信息:数据库有键入的情节和值datetime.datetime:

for e in Episode.objects.filter(): 
    print(e.date) 

2017-02-22 19:12:31.351811+00:00 
2017-02-22 19:12:31.418354+00:00 
2017-02-22 19:12:31.468889+00:00 
2017-02-22 19:12:31.524925+00:00 
2017-02-22 19:12:31.599978+00:00 
2017-02-22 19:12:31.680029+00:00 
2017-02-22 19:12:31.744071+00:00 
2017-02-22 19:12:31.803611+00:00 
2017-02-22 19:12:31.872156+00:00 
2017-02-22 22:24:56.733546+00:00 
2017-02-23 19:16:00.600644+00:00 

当我在范围照片直接使用字符串时,它的工作...

Episode.objects.filter(date__range=['2017-02-22 19:12:31.351811+00:00','2017-02-22 19:12:31.744071+00:00']) 
<QuerySet [<Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>, <Episode: Episode object>]> 

我尝试过前初始化变量...

n = now() 
page = 0 
startDate = n-timedelta(days=5*page) 
endDate = n-timedelta(days=5*(page+1)) 
Episode.objects.filter(date__range=[startDate, endDate]) 
<QuerySet []> 

你有一个IDEAR为什么我可以使用nowdatetime进行过滤,并且它可以与字符串一起使用?

编辑:查询

print(Episode.objects.filter(date__range=[startDate, endDate]).query) 
SELECT "table_episode"."id", "table_episode"."card_id", "table_episode"."date", "table_episode"."number", "table_episode"."title", "table_episode"."type_episode", "table_episode"."tag", "table_episode"."url_access" FROM "table_episode" WHERE "table_episode"."date" BETWEEN 2017-02-23 22:46:06.391779 AND 2017-02-18 22:46:06.391779 
<QuerySet []> 
+0

你可以打印查询集查询,并检查提示生成的SQL: '打印Episode.objects.filter(date__range = [N-timedelta(天数=(5 *页)),正timedelta (days =(5 *(page + 1)))]])。query' – alfredo138923

+0

感谢您的回复,我不认为这样做,我将它添加到主帖子中。 – Buky

+1

'endDate = n-timedelta(days = 5 *(page + 1))'endDate总是小于startDate。检查条件。希望它有帮助 – alfredo138923

回答

1

感谢@ alfredo138923因为是h ELP。

我将解释与解释发布给任何需要一天的人。

page = 0 
n = now() 
startDate = n-timedelta(days=5*page)  #more recently date 
endDate = n-timedelta(days=5*(page+1)) #more older date 
Episode.objects.filter(date__range=[endDate, startDate]) #range of 5 days 

我事实上,当你需要筛选使用__range但最近日期必须在第一的位置Seconde系列和oldly日期日期。

page = 0 
n = now() 
Episode.objects.filter(date__range=[n-timedelta(days=(5*(page+1))), n-timedelta(days=(5*page))]) 

相同的代码,但在一行/查询。

引用的评论的人谁不读它的:

__range是调用函数之间的SQL为其第一个参数是大于或等于和第二一个是小于或等于。 - @iklinac

0

如果您的网页= 0

startDate = n (as page = 0) 
endDate = n - 5 days 

这让0结果

之前转化为查询,现在开始日期和结束日期之间的搜索5天range documentation