首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django: timezone.now vs timezone.now()

Django: timezone.now vs timezone.now()
EN

Stack Overflow用户
提问于 2016-07-07 04:55:11
回答 5查看 26.3K关注 0票数 31

我正在将我的项目从Django 1.8.2升级到1.9.7,并收到以下警告:

代码语言:javascript
复制
WARNINGS:
my_app.my_model.date_available: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. 
If you want to have the current date as default, use `django.utils.timezone.now

以下是my_app/models.py s.py中的一行:

代码语言:javascript
复制
from django.utils import timezone
...
class my_model(models.Model):
    ...
    datetime_released = models.DateTimeField(default=timezone.now() )

如果我删除括号并使用:

代码语言:javascript
复制
datetime_released = models.DateTimeField(default=timezone.now )

Django警告消失了。这两者有什么区别?

在我的项目的另一个领域中,我在queryset过滤器中使用timezone.now():

代码语言:javascript
复制
def date_available(self):
        return self.filter(date_available__lte = timezone.now())

在这里,如果删除括号,就会引发错误:

TypeError: expected string or buffer

我可以根据需要添加/删除括号来完成这两项工作,但是timezone.now()timezone.now之间有什么区别,为什么在这些情况下它们会导致警告/错误呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-07 07:21:49

在python中,所有东西都是一个对象,包括函数。这意味着可以将函数影响到变量:

代码语言:javascript
复制
>>> from django.utils import timezone
>>> foo = timezone.now
>>> foo
<function django.utils.timezone.now>
>>> foo()
datetime.datetime(2016, 7, 7, 9, 11, 6, 489063)

函数是一个可调用的对象:

代码语言:javascript
复制
>>> callable(foo)
True
>>> callable(foo())
False

default接收到可调用时,每次请求默认值时都会调用该可调用的。

另一方面,当您在设置timezone.now()之前调用default时,会给出该值并进行修正。提醒您,以下行在服务器启动时只执行一次,因为它是一个class属性:

代码语言:javascript
复制
    datetime_released = models.DateTimeField(default=timezone.now())

因此,timezone.now()只执行一次。传递可调用的timezone.now使在需要时重新计算值成为可能。

票数 48
EN

Stack Overflow用户

发布于 2016-07-07 04:59:11

区别在于,timezone.now是一个在运行时执行的可调用的函数,而timezone.now()则返回该函数的输出。

对于models.DateTimeField,您需要使用可调用的。更好的是,只需设置auto_now_add,它可以为您完成以下操作:

代码语言:javascript
复制
datetime_released = models.DateTimeField(auto_now_add=True)

另一方面,过滤器不接受可调用的-它需要一个值。因此,当将它作为参数传递给过滤器时,您必须计算timezone.now()

票数 12
EN

Stack Overflow用户

发布于 2016-07-07 05:11:25

self.filter(date_available__lte = timezone.now())中,您希望根据当前时间对DB进行查询。所以你需要它的字符串格式。

datetime_released = models.DateTimeField(default=timezone.now)中,您希望默认为当前时间。所以你不能在那里有一个字符串。相反,您提供了一个可以返回当前时间的函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38237777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档