Django 方法存在,但调用时评估为 NoneType

1 投票
2 回答
551 浏览
提问于 2025-04-17 13:58

我在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

可以看看这段文档,关于这个话题,我相信你能找到最合适的解决办法:时区和工具

撰写回答