https://stackoverflow.com/a/17288934/4139124で説明されているように、不等式クエリを実現する方法と同様のプレースホルダー エイリアス プロパティを設定することで、計算されたプロパティをクエリできます。
具体的には、既存の attr1 および attr2 フィールドとは異なる名前のエイリアス プロパティを設定します。また、エイリアス プロパティが割り当てられるたびに呼び出されるセッターも定義し、このセッターを使用してクエリを変更します。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')
次に、attr2 ではなく attr2_alias フィールドを受け入れるように query_method を更新します。
@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 エンティティが返されます。