1

我正在使用 Danny Hermes 为 Google App Engine 创建的 Endpoints-proto-datastore。

我的模型看起来像这样:

class Datum(EndpointsModel):
    year = ndb.IntegerProperty(required=True)
    value = ndb.FloatProperty(required=True)

class Variable(EndpointsModel):
    name = ndb.StringProperty(required=True)
    data = ndb.StructuredProperty(Datum, repeated=True)

class Indicator(EndpointsModel):
    name = ndb.StringProperty(required=True)
    variables = ndb.KeyProperty(kind=Variable, repeated=True)
    formula = ndb.StringProperty(required=True)

我的 API 是这样的:

@endpoints.api(name="SomeAPI", version="v1", description="someDescription")
class SomeAPI(remote.Service):
    @Indicator.query_method(query_fields=("limit", "pageToken"), 
                            name="indicator.list",
                            path="indicators")
    def list_indicators(self, query):
        return query

问题是当我提出请求时,我得到

{
 "items": [
  {
   "name": "IndicatorName",
   "variables": [
    "agtkZXZ-bW9uaXRvcnITCxIIVmFyaWFibGUiBU1BVFJQDA",
    "agtkZXZ-bW9uaXRvcnISCxIIVmFyaWFibGUiBFBST1AM"
   ],
   "formula": "someFormula"
  }
 ]
}

但是获取变量键对我来说并没有真正的用处,因为这会迫使客户端再次请求指标实体上的变量。我想获取变量内容,如下所示:

{
 "items": [
  {
   "name": "IndicatorName",
   "variables": [
     {
      "name": "some Variable",
      "data": [
       {
        "value": 230,
        "year": 2000,
       },
       {
        "value": 250,
        "year": 2005,
       }
      ]
     },
     {
      "name": "some other Variable",
      "data": [
       {
        "value": 230,
        "year": 2000,
       },
       {
        "value": 250,
        "year": 2005,
       },
       {
        "value": 260,
        "year": 2010,
       }
      ]
     }
   ],
   "formula": "someFormula"
  }
 ]
}
4

1 回答 1

2

你不想要一个KeyProperty然后。如果要引用其他属性,请使用ndb.StructuredProperty

class Indicator(EndpointsModel):
    name = ndb.StringProperty(required=True)
    variables = ndb.StructuredProperty(Variable, repeated=True)

在像您这样的高级情况下,引用的对象可能会更改,但键不会更改,您可以使用EndpointsAliasProperty. 有关参考点,请参阅文档以获取一些示例或一些 StackOverflow 问题使用端点原型数据存储,如何将属性传递给未包含在 EndpointsModelCloud Endpoints 中的方法 - 从数据存储中检索单个实体(通过EndpointsModel 提供的辅助方法以外的属性)

更新:在添加了有关类的更多信息后,表明有特殊需要,我添加了以下内容:

对于这种特定情况,您希望将 存储variables为其他名称variable_keys,然后用于variables检索键的值:

from endpoints_proto_datastore.ndb import EndpointsAliasProperty

class Indicator(EndpointsModel):
    name = ndb.StringProperty(required=True)
    variable_keys = ndb.KeyProperty(kind=Variable, repeated=True)
    formula = ndb.StringProperty(required=True)

然后作为一个实例方法Indicator定义你的 getter (for variables) 没有关联的 setter:

    @EndpointsAliasProperty(repeated=True, property_type=Variable.ProtoModel())
    def variables(self):
      return ndb.get_multi(self.variable_keys)

我还建议_message_fields_schemaIndicator类上进行设置,以便仅在需要时调用此 getter,因为get_multi如果您不使用它,这是一个昂贵的 RPC。然后,当您希望在查询中使用它时,可以将其包含在collection_fields

    @Indicator.query_method(query_fields=("limit", "pageToken"), 
                            collection_fields=("variables", ...),
                            name="indicator.list",
                            path="indicators")
    def list_indicators(self, query):
        return query

PS:查看PEP8 - 表达式和语句中的空白;“当用于指示关键字参数或默认参数值时,不要在 = 符号周围使用空格。”

于 2013-08-20T16:09:59.917 回答