1

我如何根據從令牌獲得的user_id來查詢祖先?祖先的EndPointsModel查詢

這是我的代碼:

class MyUserClass(EndPointModel): 
    user_object = ndb.UserProperty(required=True, indexed=False) 

class MyModel(EndPointModel): 
    ... 

    @MyModel.method(user_required=True, name="model.add", path="model") 
    def add_mymodel(self, my_model): 
     gplus_user_id = auth_util.get_google_plus_user_id() 
     if gplus_user_id is None: 
     raise endpoints.ForbiddenException(NidAppUser.NO_GPLUS_ID) 

     user = MyUserClass.get_or_insert(gplus_user_id, user_object=endpoints.get_current_user()) 
     my_model.parent = user.key.string_id() 
     my_model.put() 
     return my_model 

    @MyModel.query_method(user_required=True, name="list.mymodel", path="models", 
          query_fields=('order','attr1',)) 
    def list_models(self, query): 
     gplus_user_id = auth_util.get_google_plus_user_id() 
     if gplus_user_id is None: 
     raise endpoints.ForbiddenException(NidAppUser.NO_GPLUS_ID) 

     ## Here or in thsi decorator function I want to do something like 
     ## query.ancestor.(ndb.Key(MyClassUser, gplus_user_id)) (such as the DB Datastore) 
     ## to return only the query of MyModels that belong to the current user 
     return query 

,我需要通過MyUserClass密鑰的密鑰創建查詢祖先。我不想使用該解決方案在我的模型中添加字段所有者,因爲查詢祖先比過濾器更快,並且它確實幫助我組織我的數據庫。

謝謝

回答

0

您可以構建基於祖先像這樣的查詢:

myancestorkey = ndb.Key(MyUserClass, gplus_user_id) 
myquery = MyModel.query(ancestor=myancestorkey) 
+1

好吧,謝謝你,但我的意思是如果有一種方法可以使用EndPointModel的查詢,只是爲了「更新」它或爲祖先查詢創建一種過濾器,而不是創建一個新的... –

+0

我沒有完全unde rstand你的上面的評論。你能解釋一下嗎? –

+0

在list_model方法中,我使用我在裝飾器中提到的過濾器創建的對象查詢作爲參數。我想從這個查詢中獲取祖先「myancestorkey」的子級行,而不是創建一個新的查詢。 –

0

隨着endpoints_proto_datastore你可以做這樣的事情:

@MyModel.query_method(user_required=True, name="list.mymodel", 
         path="models", query_fields=('order','attr1',)) 
def list_models(self, query): 

    # Returns only MyModels that belong to the current g+ user 

    return query.filter(MyModel.parent == auth_util. 
         get_google_plus_user_id())