在端点 - 原型数据存储区中使id不区分大小写但保留大小写

时间:2013-06-13 00:09:11

标签: python google-app-engine google-cloud-endpoints endpoints-proto-datastore

我正在尝试定义一个模型,其id不区分大小写,但保留大小写,并且下面的几乎有效:

class MyModel(endpoints_ndb.EndpointsModel):

    _message_fields_schema = ('id', 'name')

    caseful_id = ndb.StringProperty(indexed=False)
    name = ndb.StringProperty(required=True)

    def IdSet(self, value):
        if not isinstance(value, basestring):
            raise TypeError('ID must be a string.')
        self.caseful_id = value
        self.UpdateFromKey(ndb.Key(self.__class__, value.lower()))

    @endpoints_ndb.EndpointsAliasProperty(setter=IdSet)
    def id(self):
        return self.caseful_id

创建新实例将id以小写形式存储,原始大小写为caseful_id,并且获取列表会返回原始大写,但请求id的特定模型:

@MyModel.method(request_fields=('id',), path='mymodel/{id}',
                http_method='GET', name='mymodel.get')
def MyModelGet(self, mymodel):
    if not mymodel.from_datastore:
        raise endpoints.NotFoundException('MyModel not found.')
    return mymodel

始终返回请求中给出的id,具有相同的大小写。有没有办法让它实际调用id getter函数?

1 个答案:

答案 0 :(得分:2)

正在调用您的setter,它会导致您不想要的行为。把它撕下来:

def IdSet(self, value):
    if not isinstance(value, basestring):
        raise TypeError('ID must be a string.')
    self.caseful_id = value
    self.UpdateFromKey(ndb.Key(self.__class__, value.lower()))

因为你打电话

self.caseful_id = value
UpdateFromKey之前

caseful_id将始终是最近请求中的一个。

请记住UpdateFromKey尝试通过该密钥检索实体,然后修补存储在数据存储区中的实体的任何缺失数据(并设置from_datastore}到True)。

由于您在 caseful_id之前设置了UpdateFromKey字段,因此没有丢失的数据。相反,您可以这样设置值(如果尚未设置)(因此这与您的'GET'方法无关):

def IdSet(self, value):
    if not isinstance(value, basestring):
        raise TypeError('ID must be a string.')
    self.UpdateFromKey(ndb.Key(self.__class__, value.lower()))
    if self.caseful_id is None:
        self.caseful_id = value