1

id大文字と小文字を区別しないが大文字と小文字を保持するモデルを定義しようとしていますが、以下はほぼ機能します。

class MyModel(endpoints_ndb.EndpointsModel):

    _message_fields_schema = ('id', 'name')

    caseful_id = ndb.StringProperty(indexed=False)
    name = ndb.StringProperty(required=True)

    def IdSet(self, value):
        if not isinstance(value, basestring):
            raise TypeError('ID must be a string.')
        self.caseful_id = value
        self.UpdateFromKey(ndb.Key(self.__class__, value.lower()))

    @endpoints_ndb.EndpointsAliasProperty(setter=IdSet)
    def id(self):
        return self.caseful_id

新しいインスタンスを作成するidと、元の大文字と小文字が に格納されcaseful_id、リストを取得すると元の大文字が返されますが、次の方法で特定のモデルをリクエストidします。

@MyModel.method(request_fields=('id',), path='mymodel/{id}',
                http_method='GET', name='mymodel.get')
def MyModelGet(self, mymodel):
    if not mymodel.from_datastore:
        raise endpoints.NotFoundException('MyModel not found.')
    return mymodel

リクエストで指定されたものと同じものを、常にid同じ大文字で返します。id実際にゲッター関数を呼び出す方法はありますか?

4

1 に答える 1

2

セッターが呼び出されており、望ましくない動作を引き起こしています。それを引き裂く:

def IdSet(self, value):
    if not isinstance(value, basestring):
        raise TypeError('ID must be a string.')
    self.caseful_id = value
    self.UpdateFromKey(ndb.Key(self.__class__, value.lower()))

あなたが電話してから

self.caseful_id = value

beforeUpdateFromKeyの場合、caseful_idは常に最新のリクエストのものになります。

UpdateFromKeyはそのキーでエンティティを取得しようとし、データストアに格納されているエンティティから欠落しているデータにパッチを適用しようとします (さらに に設定from_datastoreしますTrue)。

の前caseful_idにフィールドを設定したため、欠損データはありません。代わりに、まだ設定されていない場合は、これを実行して値を設定できます (したがって、これはメソッドには関係ありません)。 UpdateFromKey'GET'

def IdSet(self, value):
    if not isinstance(value, basestring):
        raise TypeError('ID must be a string.')
    self.UpdateFromKey(ndb.Key(self.__class__, value.lower()))
    if self.caseful_id is None:
        self.caseful_id = value
于 2013-06-13T01:34:07.513 に答える