【问题标题】:Why date range return empty query?为什么日期范围返回空查询?
【发布时间】:2026-02-23 05:35:01
【问题描述】:

我尝试为我的渲染创建一个范围,但是当我使用 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 []>

你有一个想法,为什么我可以使用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 []>

【问题讨论】:

  • 您可以打印查询集查询并检查生成的 sql 是否有提示:print Episode.objects.filter(date__range=[n-timedelta(days=(5*page)), n-timedelta(days=(5*(page+1)))]).query
  • 感谢您的回复,我不认为这样做,我将它添加到主帖。
  • endDate = n-timedelta(days=5*(page+1)) endDate 将始终小于 startDate。检查条件。希望对你有帮助
  • 谢谢你这么笨!所有的人都在谈论 startDateendDate 在范围内,但没有人谈论 startDate (当前日期)将排在第二位。如果有人需要,我会发布结果代码。
  • @Buky 您需要了解 __range 正在调用 sql BETWEEN 函数,该函数的第一个参数大于或等于第二个参数小于或等于。

标签: django model python-3.6


【解决方案1】:

感谢@alfredo138923 的帮助。

我发布解决方案,并为每天需要它的任何人解释。

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,但最近的日期需要在第二个位置,而旧日期在第一个位置。

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

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

没有读过评论的人引用评论:

__range 正在调用第一个参数大于或等于第二个参数小于或等于的 sql BETWEEN 函数。 – @iklinac

【讨论】:

    【解决方案2】:

    如果您的页面 = 0

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

    转换为在现在开始日期和结束日期之间搜索的查询 5 天前得到 0 个结果

    range documentation

    【讨论】: