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作成されました。@propertygetter、setter、およびdocを指定できるという点で、Pythonの場合とほとんど同じように機能しますが、このコンテキストでは削除機能は指定されていません。

これらのプロパティはネットワーク経由で送信され、GoogleのAPIインフラストラクチャで使用されるため、タイプを指定する必要があります。これにより、を使用することはできません@property。さらに、、などの一般的なプロパティ/フィールドメタデータが必要repeatedですrequired

その使用法はサンプルの1つに文書化されていますが、特定のユースケースでは、

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、デフォルトのofprotorpc.messages.StringFieldが使用されます。代わりに整数が必要な場合は、代わりに次を使用できます。

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