0

計算されたプロパティをクエリするにはどうすればよいですか?

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 です。

4

1 に答える 1

0

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 エンティティが返されます。

于 2016-02-12T19:11:26.963 に答える