您可以通过设置类似于如何实现不等式查询的占位符别名属性来查询计算属性,如下所述:https ://stackoverflow.com/a/17288934/4139124
更具体地说,我们设置了一个别名属性,其名称与我们现有的 attr1 和 attr2 字段不同。我们还定义了一个 setter,只要将 alias 属性分配给它就会被调用,并使用这个 setter 来修改查询。请注意,setter 必须出现在 alias 属性上方:
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 实体。