我正在将我的项目从 Django 1.8.2 升级到 1.9.7,我收到了这个警告:
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 的行:
from django.utils import timezone
...
class my_model(models.Model):
...
datetime_released = models.DateTimeField(default=timezone.now() )
如果我删除括号并改为使用:
datetime_released = models.DateTimeField(default=timezone.now )
Django 警告消失。两者有什么区别?
在我项目的另一个领域,我在查询集过滤器中使用 timezone.now() :
def date_available(self):
return self.filter(date_available__lte = timezone.now())
在这里,如果我删除括号,则会引发错误:
TypeError: expected string or buffer
我可以通过根据需要添加/删除括号来完成这两项工作,但是 timezone.now()
和 timezone.now
之间有什么区别,为什么在这些情况下它们会导致警告/错误?
原文由 43Tesseracts 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 python 中,一切都是对象,包括函数。这意味着您可以将函数影响到变量:
函数是一个可调用对象:
当
default
收到可调用对象时,每次请求默认值时都会调用可调用对象。另一方面,当您在设置
default
timezone.now()
--- 时,会给出并固定该值。提醒一下,以下行仅在服务器启动时执行一次,因为它是一个类属性:因此
timezone.now()
只执行一次。传递可调用的timezone.now
可以在需要时重新计算值。