我有以下Django模型:
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时都执行。
这会有用吗?
答案 0 :(得分:6)
datetime.datetime.now
是一种方法。当您在没有括号的情况下调用它时,您指的是方法本身,并且您无法从方法中减去时间。当您使用括号调用时,您正在调用方法,获取返回值,然后将其用于减法。
答案 1 :(得分: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
答案 2 :(得分:3)
当然,每次调用hours_live
时都会执行它,这是一个正常的函数调用。