【问题标题】:How to filter objects that were created today (Django)如何过滤今天创建的对象(Django)
【发布时间】:2012-08-21 04:02:22
【问题描述】:
orders = Order.objects.filter(date__range=[datetime.datetime.now(), datetime.timedelta(days=1)])

我想这并不完全符合我的要求,但是当我在我的 python shell 中输入它时,我不断收到这个警告。

RuntimeWarning: DateTimeField received a naive datetime (2012-08-26 02:03:25.614372) while time zone support is active.

【问题讨论】:

    标签: django datetime


    【解决方案1】:

    这可能会对您有所帮助:link。 我没有检查这段代码,但是:

    import datetime
    yesterday = datetime.date.today() - datetime.timedelta(days=1)
    orders = Order.objects.filter(date__gt=yesterday)
    

    它将带来所有订单,其中日期字段包含昨天的日期。由于您没有未来的订单,这可能会起作用。

    【讨论】:

      【解决方案2】:

      Django 的 datetime 对象现在支持时区。 datetime.datetime.now() 返回原始对象(无时区)。要比较它们,您需要设置datetime.datetime.now() timezone-aware。

      您可以使用django.utils.timezone,它有一个API 可以让datetime.datetime 实例识别时区。

      例如:

      from django.utils import timezone
      
      timezone.make_aware(datetime_object, tzinfo_object)
      

      参考Django Time Zones

      【讨论】:

      • [import datetime] [from django.utils.timezone import utc] [now = datetime.datetime.utcnow().replace(tzinfo=utc)] 它告诉我这样做,但怎么能我将时区设为 PST?
      • 如果你安装了pytz,你可以使用import pytz tz=pytz.timezone('US/PST')获取它
      【解决方案3】:

      如果您正在使用时区感知日期,我建议您获取一天中的第一个瞬间并使用它进行过滤。

      dt = timezone.now()
      start = dt.replace(hour=0, minute=0, second=0, microsecond=0)
      Order.objects.filter(created__gte=start)
      

      请注意,如果您想要另一天的订单,例如昨天,这很容易:

      dt = timezone.now() - timedelta(days=1)
      start = dt.replace(hour=0, minute=0, second=0, microsecond=0)
      end = dt.replace(hour=23, minute=59, second=59, microsecond=999999)
      Order.objects.filter(created__range=(start, end))
      

      来源here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-13
        • 2012-10-02
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 2011-10-14
        • 2012-06-30
        相关资源
        最近更新 更多