【问题标题】:django method is there, but evaluatesto NoneType when I try to call itdjango 方法在那里,但是当我尝试调用它时评估为 NoneType
【发布时间】:2013-01-28 18:14:03
【问题描述】:

我在其中一个 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

【问题讨论】:

  • 您能否显示not callable 错误的完整回溯? (更准确地说,您确定这是引发异常的行,而不是函数中的某些内容吗?)
  • @recursive 添加了导入语句
  • 除了now,我看到filterdatetimeaggregateCount。我将从这些开始。

标签: python django methods django-models


【解决方案1】:

您似乎还没有导入 datetime 构造函数,如果您使用它,您将得到一个 naive 日期时间,这将产生一个变暖,因为该结构不包含tzinfo 对象,因此请尝试为该 datetime 使用时区感知构造函数或使用 make_aware

查看有关该主题的这篇文档,我相信您会以最合适的方式解决它Timezones and utils

【讨论】:

  • 嗯,我正在使用来自django.utils.timezonenow(),并假设它可以识别TZ,完全根据那个手册页。我错了吗?
  • 基本上在这里.filter(datetime_sent__gte=datetime(monthdate.year, monthdate.month, 1)),您可以从 TZ 感知对象中创建一个简单的日期时间。我不确定你是否可以这样做.filter(datetime_sent__gte=datetime(monthdate.year, monthdate.month, 1, monthdate.tzinfo))
  • 是的,差不多。如果有人会看这里,您应该使用它来获取 tz 感知日期:datetime_sent__gte=datetime.datetime(monthdate.year, monthdate.month, 1, tzinfo=monthdate.tzinfo) 即将其作为 tzinfo 参数传递。
【解决方案2】:

正如回溯所示,被视为None 的不是方法,而是您在其中调用的函数之一。我猜你在该模块的其他地方重新定义了datetimeCount

另外,这不是问题,但请注意,您不应在函数定义中调用 now():这样做会修复进程启动时的默认值,而不是每次都获取一个新值叫做。你应该这样做:

def getTotalMonthlyBackers(self, monthdate=None):
    if monthdate is None:
        monthdate = now()

【讨论】:

  • 是的,实际上是所有这些。我还没有弄清楚为什么,但我必须在方法级别重新导入所有必需的实用程序,而我已经在模块级别导入了它。 Monthdate - 是的,我会使用它,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 2021-01-27
  • 2017-09-13
  • 2021-05-17
相关资源
最近更新 更多