アプリケーションを古い App Engine db から ndb に移行しようとしています。カスタムの Decimal プロパティに関連する奇妙なエラーが発生し始めるまで、物事は順調に進んでいました。古いデータベースでは、Nick Johnson のコード (http://goo.gl/fpKNs) を使用しました。関数名がndbと互換性がある限り、いくつかの変更を加えましたが、大部分は残っています。これが私の修正版です:
class DecimalProperty(db.Property):
def _validate(self, value):
if not isinstance(value, (Decimal, str)):
raise datastore_errors.BadValueError('Expected decimal or string, got %r' % (value,))
return Decimal(value)
def _db_set_value(self, v, unused_p, value):
if not isinstance(value, (str, Decimal)):
raise TypeError('DecimalProperty %s can only be set to string values; received %r' % (self._name, value))
v.set_stringvalue(str(value))
def _db_get_value(self, v, unused_p):
if not v.has_stringvalue():
try:
return Decimal(v)
except ValueError:
return None
return Decimal(v.stringvalue())
トレースバックの例を次に示します。
Traceback (most recent call last):
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__
rv = self.handle_exception(request, response, e)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__
rv = self.router.dispatch(request, response)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1102, in __call__
return handler.dispatch()
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "U:\Hefner\Dropbox\Public\Projects\GHI\dev\rpc.py", line 68, in get
result = func(*args)
File "U:\Hefner\Dropbox\Public\Projects\GHI\dev\rpc.py", line 278, in getDonations
response = utilities.getAllDonations(self, settings_key, query_cursor)
File "U:\Hefner\Dropbox\Public\Projects\GHI\dev\GlobalUtilities.py", line 361, in getAllDonations
query = models.Donation.gql("WHERE settings_key = :s ORDER BY time_created DESC", s=settings_key)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\model.py", line 2885, in _gql
*args, **kwds)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\query.py", line 1318, in gql
qry = _gql(query_string)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\utils.py", line 136, in positional_wrapper
return wrapped(*args, **kwds)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\query.py", line 1366, in _gql
if prop._name != name:
AttributeError: 'str' object has no attribute '_name'
私は間違っているかもしれませんが、Decimal プロパティがプロパティのインスタンスではなく文字列を返しているようで、どうすればよいかわかりません。amount_donated = DecimalProperty()
モデル クラスでをコメント アウトすると、すべてが完全に機能します。