我正在尝试定义一个模型,其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函数?
答案 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