1

GAE バックエンド API が、各連絡先に対応する電子メールのコレクションを含む連絡先のリストを返すようにしたいと考えています。私はendpoints-proto-datastoreを使用しており、この質問のガイドラインに従ってこれを実装しました。

私の問題は、contacts_listメソッドが呼び出されると、次のようになることです。

Encountered unexpected error from ProtoRPC method implementation: BadValueError (Expected Key, got [])

Contact.email_keys が空 ([]) である可能性がありますが、この動作を制御する場所がわからないため、これが発生すると思います。

私のAPI実装の関連部分は次のとおりです。

class Email(EndpointsModel):
    type = ndb.StringProperty(choices=('home', 'work', 'other'))
    email = ndb.StringProperty()
    #.... other properties

class Contact(EndpointsModel):
    first_name = ndb.StringProperty()
    last_name = ndb.StringProperty()
    email_keys = ndb.KeyProperty(kind=Email, repeated=True)
    #.... other properties

    @EndpointsAliasProperty(repeated=True, property_type=Email.ProtoModel())
    def emails(self):
        return ndb.get_multi(self.email_keys)

    _message_fields_schema = ('id', 'first_name', 'last_name')


@endpoints.api(name='cd', version='v1')
class MyApi(remote.Service):
    @Contact.query_method(query_fields=('limit', 'order', 'pageToken'),
                          collection_fields=('id', 'first_name', 'last_name', 'emails'),
                          path='contacts', name='contacts.list')
    def contacts_list(self, query):
        return query
4

1 に答える 1

0

私は自分で解決策を見つけました。ここにあります。

モデルが から継承しEndpointsModel、 を持つプロパティを持ち、モデルのリストを取得repeated=Trueするために endpoints-proto-datastorequery_methodを作成すると、ライブラリのモジュール model.py の _PopulateFilters メソッドへの呼び出しがスタックにあることがわかります。関連するスタック トレースは次のとおりです。

ファイル「lib/endpoints_proto_datastore/ndb/model.py」、229 行目、_PopulateFilters self._AddFilter(prop == current_value) 内

model.py の 229 行付近は次のようになります。

  # Only filter for non-null values
  if current_value is not None:
    self._AddFilter(prop == current_value)

問題のモデル プロパティに が含まれている場合は、になりrepeated=True、それが私のコードが壊れていた場所です。model.py の関連部分を次のように変更し、問題を修正しました。current_value[]

  # Only filter for non-null values...
  if current_value is not None:
      # ...and non empty arrays in case of properties with repeated=True 
      if current_value:
          self._AddFilter(prop == current_value)

これが次のリリースに含まれるかどうかを確認するために、github にコメントを作成します。

于 2014-01-09T00:47:13.767 に答える