3

我正在尝试将属性传递给我的EndpointsModel中不包含的 API 调用。例如,假设我有以下模型:

class MyModel(EndpointsModel):
  attr1 = ndb.StringProperty()

然后假设我想attr2作为参数传入,但我不想attr2被用作过滤器,也不希望它存储在模型中。我只是想传入一些字符串,在方法中检索它并使用它来执行一些业务逻辑。

文档描述了query_fields用于指定要传递给方法的字段的参数,但这些似乎与模型中包含的属性耦合,因此您不能传入模型中未指定的属性。

同样,文档指出您可以通过路径变量传递属性:

@MyModel.method(request_fields=('id',),
                path='mymodel/{id}', name='mymodel.get'
                http_method='GET')
def MyModelGet(self, my_model):
  # do something with id

但这需要您更改 URL,而且这似乎与query_fields(该属性必须存在于模型中)具有相同的约束。

4

1 回答 1

9

仅针对此用例,EndpointsAliasProperty创建. 它的行为与@propertyPython 中的非常相似,因为您可以指定 getter、setter 和 doc,但在此上下文中没有指定删除器。

由于这些属性将通过网络发送并与 Google 的 API 基础设施一起使用,因此必须指定类型,因此我们不能只使用@property. 此外,我们需要典型的属性/字段元数据,例如repeated,required等。

它的使用已记录在其中一个示例中,但对于您的特定用例,

from google.appengine.ext import ndb
from endpoints_proto_datastore.ndb import EndpointsAliasProperty
from endpoints_proto_datastore.ndb import EndpointsModel

class MyModel(EndpointsModel):
  attr1 = ndb.StringProperty()

  def attr2_set(self, value):
    # Do some checks on the value, potentially raise
    # endpoints.BadRequestException if not a string
    self._attr2 = value

  @EndpointsAliasProperty(setter=attr2_set)
  def attr2(self):
    # Use getattr in case the value was never set
    return getattr(self, '_attr2', None)

由于没有property_type传递给EndpointsAliasProperty的值,因此使用默认的protorpc.messages.StringField。如果你想要一个整数,你可以改用:

@EndpointsAliasProperty(setter=attr2_set, property_type=messages.IntegerField)
于 2013-02-28T01:29:55.353 回答