1

AppEngine を使い始めたばかりで、endpoints_proto_datastore ライブラリを使用しています。私の問題: 特定の Playlist のすべての PlaylistItems をリストしようとすると、クエリ パスの 'playlist' パラメータが無視されるようです。すべての Playlists からすべての PlaylistItems を取得するだけです。

私は何を間違っていますか?モデルが KeyProperty によって関連付けられ、パス要素を介してクエリされる 2 つのモデルの例を見つけることができませんでした。また、データストアに PlaylistItem.playlist が表示されない理由もわかりません (キーの一部でない限り)。

関連するモデルとメソッドは次のとおりです。

from endpoints_proto_datastore.ndb import EndpointsAliasProperty
from endpoints_proto_datastore.ndb import EndpointsModel

class Playlist(EndpointsModel):
    """Models an individual Playlist."""
    # fixed order
   _message_fields_schema = ('id', 'user', 'title', 'private', 'created')
    # actual stored information
    user = ndb.StringProperty(required=True, indexed=True)
    title = ndb.StringProperty(required=True, indexed=False)
    private = ndb.BooleanProperty(required=False, default=True, indexed=False)
    created = ndb.DateTimeProperty(required=False, auto_now_add=True, indexed=False)


class PlaylistItem(EndpointsModel):
    """Models a playlist item (appid)"""
    # fixed order
    _message_fields_schema = ('appid', 'inserted')
    # actual stored information
    appid = ndb.StringProperty(required=True, indexed=False)
    inserted = ndb.DateTimeProperty(required=False, auto_now_add=True, indexed=True)
    playlist = ndb.KeyProperty(required=True, kind=Playlist, indexed=True)

    def PlaylistSet(self, value):
        playlist = ndb.Key(Playlist, value)

    @EndpointsAliasProperty(setter=PlaylistSet, required=True)
    def playlist(self):
        playlist

および関連するメソッド:

    @PlaylistItem.method(path='playlist/{playlist}/items', http_method='POST', name='playlist.items.put',
        request_fields=('playlist','appid'))
    def PlaylistItemPut(self, PlaylistItem):
        PlaylistItem.put()
        return PlaylistItem

    @PlaylistItem.query_method(path='playlist/{playlist}/items', name='playlist.items.list',
    query_fields=('playlist',),)
    def PlaylistItemList(self, query):
        return query # problem, I just retrieve all PlaylistItems
4

1 に答える 1

1

アレックスからの提案に基づいてコードを変更しました。私が持っていた最も重要なバグは、PlaylistSet メソッドから self.playlist を使用していなかったようです。その後、アレックスが指摘した名前の衝突がありました。以下は、すべての変更後の作業コードです。

class PlaylistItem(EndpointsModel):
    """Models a playlist item (appid)"""
    # fixed order
    _message_fields_schema = ('appid', 'inserted')
    # actual stored information
    appid = ndb.StringProperty(required=True, indexed=False)
    inserted = ndb.DateTimeProperty(required=False, auto_now_add=True, indexed=True)
    playlist = ndb.KeyProperty(required=True, kind=Playlist, indexed=True)

    def PlaylistSet(self, value):
        self.playlist = ndb.Key(Playlist, value) # FIX: MUST use self.playlist here!

    @EndpointsAliasProperty(setter=PlaylistSet, required=True)
    def myplaylist(self): # renamed the method
        return playlist   # return the playlist

また、新しい myplaylist 名を使用するように Playlist API メソッドを更新しました。

    @PlaylistItem.method(path='playlist/{myplaylist}/items', http_method='POST', name='playlist.items.put',
        request_fields=('myplaylist','appid')) # renamed request field
    def PlaylistItemPut(self, PlaylistItem):
        PlaylistItem.put()
        return PlaylistItem

    @PlaylistItem.query_method(path='playlist/{myplaylist}/items', name='playlist.items.list',
        query_fields=('myplaylist',),) # renamed request field
    def PlaylistItemList(self, query):
        return query

また、Datastore ビューアにプレイリストの「列」が表示されます (ご想像のとおり、以前は設定されていませんでした)。

于 2015-01-20T17:51:26.033 に答える