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,只要将 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 实体。

于 2016-02-12T19:11:26.963 回答