如何在query_method中过滤ComputedProperty?

时间:2013-10-02 17:05:03

标签: endpoints-proto-datastore

如何查询计算属性?

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,无论传入的是什么。

1 个答案:

答案 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实体。