我正在将我的项目从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 s.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警告消失了。这两者有什么区别?
在我的项目的另一个领域中,我在queryset过滤器中使用timezone.now():
def date_available(self):
return self.filter(date_available__lte = timezone.now())在这里,如果删除括号,就会引发错误:
TypeError: expected string or buffer
我可以根据需要添加/删除括号来完成这两项工作,但是timezone.now()和timezone.now之间有什么区别,为什么在这些情况下它们会导致警告/错误呢?
发布于 2016-07-07 07:21:49
在python中,所有东西都是一个对象,包括函数。这意味着可以将函数影响到变量:
>>> from django.utils import timezone
>>> foo = timezone.now
>>> foo
<function django.utils.timezone.now>
>>> foo()
datetime.datetime(2016, 7, 7, 9, 11, 6, 489063)函数是一个可调用的对象:
>>> callable(foo)
True
>>> callable(foo())
False当default接收到可调用时,每次请求默认值时都会调用该可调用的。
另一方面,当您在设置timezone.now()之前调用default时,会给出该值并进行修正。提醒您,以下行在服务器启动时只执行一次,因为它是一个class属性:
datetime_released = models.DateTimeField(default=timezone.now())因此,timezone.now()只执行一次。传递可调用的timezone.now使在需要时重新计算值成为可能。
发布于 2016-07-07 04:59:11
区别在于,timezone.now是一个在运行时执行的可调用的函数,而timezone.now()则返回该函数的输出。
对于models.DateTimeField,您需要使用可调用的。更好的是,只需设置auto_now_add,它可以为您完成以下操作:
datetime_released = models.DateTimeField(auto_now_add=True)另一方面,过滤器不接受可调用的-它需要一个值。因此,当将它作为参数传递给过滤器时,您必须计算timezone.now()。
发布于 2016-07-07 05:11:25
在self.filter(date_available__lte = timezone.now())中,您希望根据当前时间对DB进行查询。所以你需要它的字符串格式。
在datetime_released = models.DateTimeField(default=timezone.now)中,您希望默认为当前时间。所以你不能在那里有一个字符串。相反,您提供了一个可以返回当前时间的函数。
https://stackoverflow.com/questions/38237777
复制相似问题