我试图定义一个模型,其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