如何查询计算属性?
class MyModel(EndpointsModel):
attr1 = ndb.IntegerProperty(default=0)
@EndpointsComputedProperty(property_type=messages.BooleanField)
def attr2(self):
return self.attr1 % 2 == 1
@endpoints.api(name='myapi', version='v1', description='My Little API')
class MyApi(remote.Service):
@MyModel.query_method(query_fields=('attr2'),
path='mymodels', name='mymodel.list')
def MyModelList(self, query):
return query
在这种情况下,query
将始终有一个过滤器,用于测试attr2 == False
。
原因似乎是过滤器是使用FromMessage
创建的实体创建的。由于attr2
是计算属性,因此无法设置。由于attr1
默认为0,attr2
始终为False,无论传入的是什么。
答案 0 :(得分:0)
您可以通过设置占位符别名属性来查询计算属性,类似于如何实现不等式查询,如下所述:https://stackoverflow.com/a/17288934/4139124
更具体地说,我们使用与现有attr1和attr2字段不同的名称设置别名属性。我们还定义了一个setter,只要分配了alias属性就会调用它,并使用这个setter来修改查询。请注意,setter必须出现在别名属性上方:
import logging
from google.appengine.ext import ndb
from endpoints_proto_datastore.ndb import EndpointsModel
from endpoints_proto_datastore.ndb.properties import EndpointsAliasProperty
from endpoints_proto_datastore.ndb.properties import EndpointsComputedProperty
from protorpc import messages
class MyModel(EndpointsModel):
attr1 = ndb.IntegerProperty(default=0)
@EndpointsComputedProperty(property_type=messages.BooleanField)
def attr2(self):
return self.attr1 % 2 == 1
def Attr2AliasSetter(self, value):
self._endpoints_query_info._filters.add(MyModel.attr2 == value)
@EndpointsAliasProperty(name='attr2_alias',
property_type=messages.BooleanField,
setter=Attr2AliasSetter)
def Attr2Alias(self):
logging.error('attr2_alias should never be accessed')
然后我们更新query_method以接受attr2_alias字段而不是attr2:
@endpoints.api(name='myapi', version='v1', description='My Little API')
class MyApi(remote.Service):
@MyModel.query_method(query_fields=('attr2_alias'),
path='mymodels', name='mymodel.list')
def MyModelList(self, query):
return query
然后,例如,查询myapi/mymodels?attr2_alias=true
将返回attr2设置为true的所有MyModel实体。