1

ndb.DateTimeProperty を持つ ndb.Model と、ndb.DateTimeProperty を使用してタイムスタンプを作成する ndb.ComputedProperty があります。

import time
from google.appengine.ext import ndb

class Series(ndb.Model):
    updatedDate = ndb.DateTimeProperty(auto_now=True)
    time = ndb.ComputedProperty(lambda self: time.mktime(self.updatedDate.timetuple()))

私が抱えている問題は、.put() への最初の呼び出しにあります (seriesObj は Series クラスから作成されたオブジェクトです)

seriesObj.put()

ndb.DateTimeProperty は現時点では空です。次のエラーが表示されます。

File "/main.py", line 0, in post series.put()
time = ndb.ComputedProperty(lambda self: time.mktime(self.updatedDate.timetuple()))
AttributeError: 'NoneType' object has no attribute 'timetuple'

これは、ndb.DateTimeProperty が設定されていないためだと言えますが、ndb.ComputedProperty が読み取られる前に設定する方法がわかりません。

これは ndb.ComputedProperty の問題ではありません。これは、ndb.DateTimeProperty セットでテストしたところ、正常に動作するためです。

どんな助けでも素晴らしいでしょう!

4

3 に答える 3

1

この問題をさらに調査した後、モジュールのインポート時にデフォルト値が評価されないようにしました。updatedDate新しい を作成するときにの初期値を設定しましたSeries

import datetime
series = Series(updatedDate = datetime.datetime.now())
series.put()

私はより「考えない」ソリューションを使用することを好みました_pre_put_hookが、テストでは、の評価の前に呼び出されたようには見えませんでしたtime ComputedProperty

于 2013-08-13T02:46:27.030 に答える
1

問題を考え出した、それは実際には簡単な解決策でした。私は単に行を編集しました

updatedDate = ndb.DateTimeProperty(auto_now=True)

デフォルトのパラメータを含めるには

updatedDate = ndb.DateTimeProperty(auto_now=True, default=datetime.datetime.now())

datetime モジュールもインポートする必要がありました

import datetime

これが更新されると、オブジェクトはエラーなしで作成されました。これで、エラーなしで実行されるだけでなく、updateDate の初期値が現在の日付と時刻に設定されます。悪いことに、auto_now パラメータはこれを自動的に行いません。

この解決策を手伝ってくれたすべての人に感謝します!

于 2013-08-12T03:37:38.717 に答える