Django:timezone.now与timezone.now() [英] Django: timezone.now vs timezone.now()

查看:290
本文介绍了Django:timezone.now与timezone.now()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将项目从Django 1.8.2升级到1.9.7,并且收到此警告:

 警告:
my_app.my_model.date_available:(fields.W161)提供了固定的默认值。
提示:您似乎将此字段的默认日期/时间/日期时间值设置为默认值。这可能不是您想要的。
如果您想将当前日期作为默认日期,请使用django.utils.timezone.now

这是my_app / models.py中的行:



来自django.utils导入时区
...
类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:预期的字符串或缓冲区






我可以通过按需添加/删除括号来完成这两项工作,但是 timezone.now() timezone有什么区别.now 以及为什么它们会在这些情况下引起警告/错误?

解决方案

在python中,一切都是一个对象,包括功能。这意味着您可以将函数影响到变量:

 >>从django.utils导入时区
>> foo = timezone.now
>> foo
< function django.utils.timezone.now>
>> foo()
datetime.datetime(2016、7、7、9、11、6、489063)

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

 >> callable(foo)

>>> callable(foo())

默认时接收一个可调用对象,每次请求默认值时都会调用该可调用对象。



另一方面,当您调用 timezone.now()设置 default 之前,该值已指定并固定。提醒一下,由于这是类属性,因此以下行仅在服务器启动时执行一次:

  datetime_released = models .DateTimeField(default = timezone.now())

并因此时区。 now()仅执行一次。传递一个可调用的 timezone.now 可以在需要时重新计算该值。


I am in the process of upgrading my project from Django 1.8.2 to 1.9.7 and I'm getting this warning:

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

Here's the line from my_app/models.py:

from django.utils import timezone
...
class my_model(models.Model):
    ...
    datetime_released = models.DateTimeField(default=timezone.now() )

If I remove the parentheses and instead use:

datetime_released = models.DateTimeField(default=timezone.now )

The Django warning goes away. What's the difference between the two?


In another area of my project I am using timezone.now() in a queryset filter:

def date_available(self):
        return self.filter(date_available__lte = timezone.now())

Here, if I remove the parentheses, an error is thrown:

TypeError: expected string or buffer


I can get both of these two work by adding/removing the parenthesis as required, but what is the difference between timezone.now() and timezone.now and why do they cause warnings/errors in these cases?

解决方案

In python everything is an object, including functions. This means you can affect a function to a variable:

>>> from django.utils import timezone
>>> foo = timezone.now
>>> foo
<function django.utils.timezone.now>
>>> foo()
datetime.datetime(2016, 7, 7, 9, 11, 6, 489063)

A function is a callable object:

>>> callable(foo)
True
>>> callable(foo())
False

When default receives a callable, the callable is called each time a default value is requested.

On the other hand, when you call timezone.now() prior to setting default, the value is given and fixed. As a reminder, the following line is executed only once at server start up, since it is a class attribute:

    datetime_released = models.DateTimeField(default=timezone.now())

and thus timezone.now() is executed only once. Passing a callable timezone.now makes it possible to recalculate the value whenever it needs to be.

这篇关于Django:timezone.now与timezone.now()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆