2011-06-14 65 views
3

我有以下的Django模型:Python - timedelta对象何时被处理?

created=models.DateTimeField(auto_now_add=True) 

我现在需要这表明自创立小时#模型对象的方法。我试过如下:

def hours_live(self): 
    diff=((datetime.datetime.now - self.created).seconds)/3600 
    return diff 

但它扔了一个TypeError

unsupported operand type(s) for -: 'builtin_function_or_method' and 'datetime.datetime' 

然后,我

def hours_live(self): 
    diff=((datetime.datetime.now() - self.created).seconds)/3600 
    return diff 

时是否执行我的问题的datetime.datetime.now()的表达这里只有一次或每次执行hours_live时被调用。

这项工作?

回答

5

在您的示例中,每次调用该函数时都会执行它。问题在于datetime.datetime.now()被用作函数定义中参数的默认值。在这种情况下,当模块被加载时它只执行一次。

例如:(这是危险的,因为因为计算只有当模块被加载一次):

def hours_live(since=datetime.datetime.now()): 
    return since - self.created 

你还是该做的事:

def hours_live(since=None): 
    if not since: 
     since = datetime.datetime.now() 
    return since - self.created 
+0

很好的例子马哈茂德,为感谢澄清它。 – Ben 2011-06-14 17:12:05

3

当然,它每次调用hours_live时都会执行,这是一个正常的函数调用。

6

datetime.datetime.now是一种方法。当你在没有括号的情况下调用它时,你指的是方法本身,并且你不能从方法中减去一个时间。当你用括号将它称为时,你正在调用该方法,获得返回值,然后将其用于减法。