1

我正在尝试定义一个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

创建一个新实例存储idin 小写,原始大写 in 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请求中给出的相同大小,大小写相同。有没有办法让它真正调用idgetter函数?

4

1 回答 1

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

before UpdateFromKey, thecaseful_id将始终是最近请求中的那个。

请记住,UpdateFromKey尝试通过该键检索实体,然后从存储在数据存储中的实体中修补任何丢失的数据(并且也设置from_datastoreTrue)。

由于您之前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
于 2013-06-13T01:34:07.513 回答