使id不区分大小写,但在endpoint -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函数?

你的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