【问题标题】:Is timezone.now().date a function or a callable?timezone.now().date 是函数还是可调用函数?
【发布时间】:2014-05-04 19:57:22
【问题描述】:

我正在用 Django 1.5 编写管理器。我想返回一个QuerySet,其中包含开始日期为今天或将来的对象。基于this answer 到之前的问题,我认为我的经理需要使用可调用而不是函数。我写过:

...
return super(UpcomingEventManager, self).get_query_set().filter(date__gte=timezone.now().date)

我认为该代码是一个可调用的 (date),它的值依赖于一个函数 (timezone.now())。但是 Django 会将其视为可调用的还是函数?

我知道我可以通过创建一个对象并等到明天来测试这一点,但我宁愿完全理解这一点。

【问题讨论】:

    标签: django function callback django-managers


    【解决方案1】:

    Django 1.10 获取今天的日期:

    >>> from django.utils import timezone
    >>> timezone.now()
    datetime.datetime(2016, 11, 29, 7, 23, 55, 924928, tzinfo=<UTC>)
    >>> timezone.now().date
    <built-in method date of datetime.datetime object at 0x7f42512b42a0>
    >>> timezone.now().date()
    datetime.date(2016, 11, 29)
    

    【讨论】:

      【解决方案2】:

      您似乎在以一种我在这里不认识的方式使用回调。

      timezone.now() 返回一个 datetime.datetime 类型的值。该类有一个属性date,它返回该值的日期部分。这里根本不涉及回调。

      编辑您的困惑源于对上一个问题的误读。这是关于模型字段声明中使用的默认值:正如那里的答案所述,您需要使用可调用而不是值,因为声明是在第一次导入时评估的。

      但这根本不是你在这里所做的。您只是将一个值从另一个函数传递给一个函数。不涉及早期评估:将在调用函数时评估代码,因此在那里使用date()today() 是非常安全的。事实上,在这种情况下,传递可调用对象而不是传递值将起作用。

      (此外,您应该在这里使用“可调用”一词而不是“回调”:回调意味着某种异步行为,这不是正在发生的事情。)

      【讨论】:

      • 如果我理解正确,那么正确的方法就是datetime.date.today,因为这是today 函数的回调。那正确吗?此外, timezone.now().date 返回日期函数,而不是值。
      • 我想我现在明白了。谢谢你。我已按照您的建议编辑了问题以澄清术语。
      • 如果您使用设置 USE_TZ = True 并且正在使用 timezone.now().date(),那么您真正想要的是 timezone.localdate(),否则您将获得 UTC 时区的日期。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多