Django 方法存在,但调用时评估为 NoneType
我在Django的一个模型里写了一个自定义的方法,这个方法主要是用来从数据库里获取一些数据并进行求和。这个方法是这样的:
from django.utils.timezone import utc, now
...
class Project(models.Model):
...
def getTotalMonthlyBackers(self, monthdate=now()):
from pledger.models import DonationHistory
return (DonationHistory.objects
.filter(project=self)
.filter(datetime_sent__gte=datetime(monthdate.year, monthdate.month, 1))
.aggregate(Count('user', distinct=True))['user__count'])
当我尝试通过
print project.getTotalMonthlyBackers()
来调用这个方法时,我遇到了一个错误:'NoneType' object is not callable
不过我如果直接输出这个方法,看看是不是写错了:
print project.getTotalMonthlyBackers
我得到的结果是:<bound method Project.getTotalMonthlyBackers of <Project: Putty>>
这说明这个方法确实存在,并且和一个特定的Project
对象绑定在一起。
在Python中,有一些很明显的事情我没搞明白,关于如何调用这个方法,但我从手册里找不到答案。
错误追踪信息:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/mnt/hgfs/Projects/BitFund/Sources/source/project/views/project_view_details.py" in view
101. print project.getTotalMonthlyBackers()
File "/mnt/hgfs/Projects/BitFund/Sources/source/project/models.py" in getTotalMonthlyBackers
76. .filter(datetime_sent__gte=datetime(monthdate.year, monthdate.month, 1))
Exception Type: TypeError at /putty_1
Exception Value: 'NoneType' object is not callable
2 个回答
1
从错误信息来看,问题不是出在方法本身被当作None
,而是你在这个方法里调用的某个函数出了问题。我猜测你可能在这个模块的其他地方重新定义了datetime
或者Count
。
另外,这虽然不是主要问题,但要注意在函数定义里不要调用now()
:这样做会把默认值固定为进程开始时的时间,而不是每次调用时都获取新的值。你应该这样做:
def getTotalMonthlyBackers(self, monthdate=None):
if monthdate is None:
monthdate = now()
1
看起来你还没有导入 datetime
这个构造函数。如果你使用它,你会得到一个天真的日期时间,这会产生一个警告,因为这个结构里没有 tzinfo
对象。所以建议你使用一个支持时区的构造函数来创建这个日期时间,或者使用 make_aware
。
可以看看这段文档,关于这个话题,我相信你能找到最合适的解决办法:时区和工具