1

저는 AppEngine에서 시작하여 endpoints_proto_datastore 라이브러리를 사용하고 있습니다. 내 문제 : 특정 재생 목록에 대한 모든 PlaylistItems를 나열하려고하면 쿼리 경로의 '재생 목록'매개 변수가 무시 된 것 같습니다. 방금 모든 재생 목록에서 모든 PlaylistItem을 검색합니다.키 프로퍼티에 의한 파이썬 endpoints_proto_datastore 쿼리

내가 뭘 잘못하고 있니? 모델이 KeyProperty와 관련이 있고 경로 요소를 통해 쿼리되는 두 모델로 예제를 찾을 수 없었습니다. 또한 키 스토어에 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 
+0

메서드와 alias-property의'playlist'와 KeyProperty의'playlist' 사이에 이름 충돌이있을 수 있습니다. 어쩌면 이름 바꾸기를 시도해보십시오. 또한,'def playlist'의 본체는'playlist'를 언급하지만 아무 것도하지 않습니다 (그래서 None을 반환합니다). 아마도'return'을 의미할까요? –

+0

감사! 두 가지 변경을하고 내 데이터 저장소를 지우고 이제 마침내 작동합니다. 내가 만든 정확한 변경 내용을 덧붙일 것입니다 – pisquared

답변

1

나는 알렉스의 제안에 따라 코드를 변경

는 관련 모델 및 방법입니다. PlaylistSet 메서드에서 self.playlist를 사용하지 않는 것이 가장 중요한 버그 인 것 같습니다. 그 후 알렉 스가 지적한 이름의 충돌이있었습니다.

@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 
나는 또한 데이터 저장소 뷰어에서 재생 목록 "열"을 볼 수 있습니다

(:

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 이름을 사용하는 재생 목록 API 방법 업데이트 : 아래의 모든 변경 후 작업 코드는 예상대로, 이전에는 설정되지 않았습니다).

+0

나는 '재생 목록 반환'이 효과가 있다는 것에 놀랐습니다. 거기에'return self.playlist'가 있습니다! –

관련 문제