对象没有属性 _Message__decoded_fields
object has no attribute _Message__decoded_fields
我有两个模型:
class Location(EndpointsModel):
geoLocation = ndb.GeoPtProperty()
street = ndb.StringProperty()
city = ndb.StringProperty()
state = ndb.StringProperty()
class UserPost(EndpointsModel):
_message_fields_schema = ("entityKey", "title", "description", "category", "date", "time", "status", "locationOne")
category = ndb.IntegerProperty(indexed=True,validator=checkIfValidCategory)
title = ndb.StringProperty()
description = ndb.TextProperty()
date = ndb.DateProperty(indexed=True,auto_now_add=True)
time = ndb.IntegerProperty(indexed=True)
status = ndb.IntegerProperty(indexed=True,validator=checkIfValidStatusType)
locationOne = ndb.StructuredProperty(Location,indexed=False)
我正在尝试通过以下方法在 UserPost 上插入:
@UserPost.method(name='userPost.insert', path='userPost/insert', http_method='POST')
def userPost_insert(self,r):
""" insert userPost """
user = Auth.get_current_user(verified_email_required=True)
if user is None:
raise endpoints.UnauthorizedException('You must have a verified account before you can post')
if r.title is None:
raise endpoints.BadRequestException('Missing title')
i_post = r
i_post.put()
return i_post
这是来自客户端的JSON:
{
"title":"asdf",
"details":"asdf",
"locationOne":{
"state":"test",
"geoLocation":{
"lon":0.127592,
"lat":51.503407051
},
"city":"test",
"street":"test"
}
}
如果我取出 locationOne,它会起作用,但是当我尝试使用该位置插入时,出现错误。这是我的堆栈跟踪:
INFO 2016-03-25 17:08:52,389 module.py:787] default: "POST /_ah/spi/Auth.CurrentUser HTTP/1.1" 200 207
INFO 2016-03-25 17:08:52,389 module.py:787] default: "GET /_ah/api/auth/v1.0/current_user HTTP/1.1" 200 224
INFO 2016-03-25 17:09:01,631 module.py:787] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 200 95185
ERROR 2016-03-25 17:09:01,644 service.py:191] Encountered unexpected error from ProtoRPC method implementation: AttributeError ('Location' object has no attribute '_Message__decoded_fields')
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/protorpc-1.0/protorpc/wsgi/service.py", line 181, in protorpc_service_app
response = method(instance, request)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/endpoints-1.0/endpoints/api_config.py", line 1331, in invoke_remote
return remote_method(service_instance, request)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/protorpc-1.0/protorpc/remote.py", line 414, in invoke_remote_method
response = method(service_instance, request)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 1408, in EntityToRequestMethod
request = cls.FromMessage(request)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 1232, in FromMessage
to_add = FromValue(value_property, value)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 139, in FromValue
return modelclass.FromMessage(value)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 1216, in FromMessage
if not field.name in message._Message__decoded_fields:
AttributeError: 'Location' object has no attribute '_Message__decoded_fields'
任何对此的见解将不胜感激。提前致谢。
我不熟悉 EndpointsModel,但查看您的代码,我可以看到 Location 模型没有
的条目
_message_fields_schema
就像您对 UserPost 模型所做的一样。你为什么不试试把它放上去看看它是否能解决问题?
抱歉,我应该早点回答这个问题,但这个问题已经解决了。这实际上是 endpoints-proto-datastore 模型的一个错误,其中传入的 json 没有被正确解析并转换为它们各自的数据存储实体。我发布了对这个问题的更好描述 here and you can see the fix implemented here。
我有两个模型:
class Location(EndpointsModel):
geoLocation = ndb.GeoPtProperty()
street = ndb.StringProperty()
city = ndb.StringProperty()
state = ndb.StringProperty()
class UserPost(EndpointsModel):
_message_fields_schema = ("entityKey", "title", "description", "category", "date", "time", "status", "locationOne")
category = ndb.IntegerProperty(indexed=True,validator=checkIfValidCategory)
title = ndb.StringProperty()
description = ndb.TextProperty()
date = ndb.DateProperty(indexed=True,auto_now_add=True)
time = ndb.IntegerProperty(indexed=True)
status = ndb.IntegerProperty(indexed=True,validator=checkIfValidStatusType)
locationOne = ndb.StructuredProperty(Location,indexed=False)
我正在尝试通过以下方法在 UserPost 上插入:
@UserPost.method(name='userPost.insert', path='userPost/insert', http_method='POST')
def userPost_insert(self,r):
""" insert userPost """
user = Auth.get_current_user(verified_email_required=True)
if user is None:
raise endpoints.UnauthorizedException('You must have a verified account before you can post')
if r.title is None:
raise endpoints.BadRequestException('Missing title')
i_post = r
i_post.put()
return i_post
这是来自客户端的JSON:
{
"title":"asdf",
"details":"asdf",
"locationOne":{
"state":"test",
"geoLocation":{
"lon":0.127592,
"lat":51.503407051
},
"city":"test",
"street":"test"
}
}
如果我取出 locationOne,它会起作用,但是当我尝试使用该位置插入时,出现错误。这是我的堆栈跟踪:
INFO 2016-03-25 17:08:52,389 module.py:787] default: "POST /_ah/spi/Auth.CurrentUser HTTP/1.1" 200 207
INFO 2016-03-25 17:08:52,389 module.py:787] default: "GET /_ah/api/auth/v1.0/current_user HTTP/1.1" 200 224
INFO 2016-03-25 17:09:01,631 module.py:787] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 200 95185
ERROR 2016-03-25 17:09:01,644 service.py:191] Encountered unexpected error from ProtoRPC method implementation: AttributeError ('Location' object has no attribute '_Message__decoded_fields')
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/protorpc-1.0/protorpc/wsgi/service.py", line 181, in protorpc_service_app
response = method(instance, request)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/endpoints-1.0/endpoints/api_config.py", line 1331, in invoke_remote
return remote_method(service_instance, request)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/protorpc-1.0/protorpc/remote.py", line 414, in invoke_remote_method
response = method(service_instance, request)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 1408, in EntityToRequestMethod
request = cls.FromMessage(request)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 1232, in FromMessage
to_add = FromValue(value_property, value)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 139, in FromValue
return modelclass.FromMessage(value)
File "/Users/buddydelaune/Dev/Apps/noble-py-proto/endpoints_proto_datastore/ndb/model.py", line 1216, in FromMessage
if not field.name in message._Message__decoded_fields:
AttributeError: 'Location' object has no attribute '_Message__decoded_fields'
任何对此的见解将不胜感激。提前致谢。
我不熟悉 EndpointsModel,但查看您的代码,我可以看到 Location 模型没有
的条目_message_fields_schema
就像您对 UserPost 模型所做的一样。你为什么不试试把它放上去看看它是否能解决问题?
抱歉,我应该早点回答这个问题,但这个问题已经解决了。这实际上是 endpoints-proto-datastore 模型的一个错误,其中传入的 json 没有被正确解析并转换为它们各自的数据存储实体。我发布了对这个问题的更好描述 here and you can see the fix implemented here。