1

Как я могу выполнить запрос по предку в соответствии с user_id, который я получаю из токена?EndPointsModel query by ancestor

Это мой код:

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. Я не хочу использовать решение, чтобы добавить владельца поля в мою модель, потому что запрос-предок быстрее, чем фильтры, и это действительно помогает мне организовать мой db.

Спасибо

ответ

0

Вы можете создать запрос, основанный на предка, как это:

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

Ладно, спасибо, но я имею в виду если есть способ использовать запрос EndPointModel и просто «обновить» его или создать вид фильтров для запроса предков, а не создавать новый ... –

+0

я не полностью отказался сравните свой комментарий выше. не могли бы вы объяснить? –

+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())