【问题标题】:Django - Filter objects by DateTimeField with a date rangeDjango - 通过 DateTimeField 过滤具有日期范围的对象
【发布时间】:2020-09-08 23:44:49
【问题描述】:

我有一个如下所示的日期时间字段,

class Data(models.Model):
    time = models.DateTimeField(default=timezone.now)

我想根据模板表单中的日期范围获取对象。 我已经看到了过滤 DateField 的方法,但没有过滤 DateTimeField。 有人可以帮忙吗?

【问题讨论】:

  • 它们应该是一样的。你都尝试了些什么?你有什么错误吗?
  • 过滤DateTime字段时,用于比较的值必须是Python DateTime类型。您可以使用 datetime.strptime 从字符串格式化 DateTime 变量,然后应用 __gte __lte ... 等运算符进行过滤。
  • @ruddra 我试过 instances = CameraData.objects.filter(time__range=["2020-05-19", "2020-05-20"]) 。使用它,错误是` RuntimeWarning:DateTimeField CameraData.time 在时区支持处于活动状态时收到了一个幼稚的日期时间(2020-05-20 00:00:00)。 `
  • @JayendraKantipudi 我已经转发了我的评论来回答。请让它成为您问题的答案!

标签: django django-queryset django-filter


【解决方案1】:

过滤 DateTime 字段时,用于比较的值必须是 Python DateTime 类型。您可以使用 datetime.strptime 从字符串格式化 DateTime 变量,然后应用 __gte __lte ... 等运算符进行过滤。

【讨论】:

    【解决方案2】:

    我偶然发现了这一点,因为它帮助我找到了解决我自己问题的方法,所以我想添加更多细节。

    cmets中提到的错误是

    RuntimeWarning: DateTimeField [...] received a naive datetime [...] while time zone support is active.
    

    基本上只是意味着需要知道日期才能进行比较。 在这种情况下,根据对提到错误的问题的评论,range 运算符应该可以正常工作,如果该问题已修复(并且确实如此)。 我们只需要给它一个可感知的日期时间值,而不是给操作员简单的值。

    from datetime import datetime, timedelta
    from django.utils import timezone
    
    # the datetime value passed to make_aware() can be any datetime
    # you could even use datetime.strptime() if you want
    # (as mentioned in the accepted anwser)
    # there are more ways to make datetime aware
    # but this was simplest to me
    aware_datetime = timezone.make_aware(datetime.now())
    
    # storing the two dates for easier reading
    start_date = aware_datetime - timedelta(days=1)
    end_date = aware_datetime + timedelta(days=1)
    
    filtered_qs = Model.objects.filter(DateTimeField__range=[start_date, end_date])
    
    

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2022-07-07
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多