1

Django モデルの 1 つにカスタム メソッドがあり、定期的な DB データのフェッチと集計を行います。はい、これ:

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
4

2 に答える 2

1

datetimeコンストラクターをまだインポートしていないようです。また、それを使用すると、単純な日時が得られます。その構造にはオブジェクトが含まれていないため、ウォーミングが発生します。その日時tzinfoにタイムゾーン対応のコンストラクターを使用してみてください。または を使用します。make_aware

トピックに関するこのドキュメントをチェックしてください。最も適切な方法で解決できると確信しています

于 2013-01-28T18:51:15.843 に答える
1

トレースバックが示すように、 として扱われているのはメソッドではなく、そのNone中で呼び出す関数の 1 つです。そのモジュールのいずれかdatetimeまたは他の場所を再定義したと思います。Count

また、これは問題ではありませんが、関数定義で呼び出すべきではないことに注意してくださいnow()。これにより、呼び出されるたびに新しい値を取得するのではなく、プロセスが開始された時点でのデフォルトが修正されます。代わりにこれを行う必要があります。

def getTotalMonthlyBackers(self, monthdate=None):
    if monthdate is None:
        monthdate = now()
于 2013-01-28T19:09:36.370 に答える