Return 来自 Python 中 Cloud Endpoint 的数据存储实体

Return Datastore Entity from Cloud Endpoint in Python

有没有办法 return 数据存储实体,使其成为 python 中云端点 api 实现中 request/response 消息的一部分?

例如:

我的实体模型定义如下

class District(ndb.Model):
    code = ndb.StringProperty(required=True)

现在我想在 python 中实施云 api 作为

 @endpoints.method(request_message=DistrictMessage, response_message=DistrictMessage, name="DistrictApi.get_by_code")
def get_by_code(self, request):
#get code from District object in request message and 
#try to get entity based on it from datastore

其中 DistrictMessage 定义为

class DistrictMessage(messages.Message):    
    district = messages.MessageField(District, 1, required=False)

以上不起作用,因为学区不是 messages.Message,而是 ndb.Model。我们可以在 GAE Java 中做类似的事情,但我无法在 python 中找到它。有可能吗?或者我是否必须为每个实体定义一个消息 class 并进行 to/from 映射?

谢谢, 里兹塔克

无法直接执行此操作。您可以查看 http://endpoints-proto-datastore.appspot.com/ 补充库,让您使用模型而不是消息。

如果你想自己做,你将不得不做这样的事情。

class DistrictMessage(messages.Message):    
    code = messages.StringField(1, required=True)

class SomeApiClass():  # incomplete class def for syntax highlighting
    @endpoints.method(request_message=DistrictMessage, response_message=DistrictMessage, name="DistrictApi.get_by_code")
    def get_by_code(self, request):
        # get code from District object in request message and 
        # try to get entity based on it from datastore
        district = District.query(District.code == request.code).get()
        if district:
            # copy District properties to DistrictMessage kwargs
            # ndb.Model.to_dict() can be used here if you filter
            # out properties that aren't used in the DistrictMessage
            return DistrictMessage(code=district.code)
        raise endpoints.NotFoundException()