【问题标题】:Django: datetime filter by date ignoring timeDjango:按日期过滤日期时间忽略时间
【发布时间】:2018-01-25 20:33:13
【问题描述】:

我正在尝试过滤在某一天安排的Matches。我不能这样做:

match_queryset.filter(start=date)

因为它也会按时间过滤,但我可以这样做:

match_queryset.filter(start__year=a_date.year, start__month=a_date.month, start__day=a_date.day)

但这太复杂了,我觉得可以有更简单的方法。

那我也可以使用范围:

t0 = datetime.datetime.combine(a_date, datetime.time(0, 0))
t1 = datetime.datetime.combine(a_date, datetime.time(23, 59, 59))
match_queryset.filter(start__gte=t0, start__lte=t1)

但这似乎有点矫枉过正,它可能会产生低效的查询。

我不能只查询实际日期吗?比如:

# this of course doesn't work
match_queryset.filter(start__date=date)

不用说我已经尝试过寻找解决方案但找不到任何解决方案。

【问题讨论】:

标签: python django


【解决方案1】:

从 Django 1.9 开始,您可以使用 __date field lookup,正如您在问题中提到的那样。对于旧版本,您将不得不使用其他方法。

例如

Entry.objects.filter(start__date=datetime.date(2005, 1, 1))
Entry.objects.filter(start__date__gt=datetime.date(2005, 1, 1))

【讨论】:

    【解决方案2】:

    如果您不能使用__date 过滤器,我认为最干净的方法是这样做:

    from datetime import datetime, timedelta
    
    d = datetime.now()  # or whatever you want
    
    match_queryset.filter(start__gte=d.date(), start__lt=d.date()+timedelta(days=1))
    

    如果你在 Django 的settings.py 中有USE_TZ=True,你会收到警告:

    RuntimeWarning: DateTimeField (...) received a naive datetime (...) while time zone support is active.
    

    但过滤器仍然可以工作。将在 Django 的时区进行比较(TIME_ZONE 来自settings.py),至少我是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 2015-03-06
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      相关资源
      最近更新 更多