【问题标题】:EndPointsModel query by ancestorEndPointsModel 按祖先查询
【发布时间】:2013-07-24 04:46:48
【问题描述】:

如何根据我从令牌中获得的 user_id 进行祖先查询?

这是我的代码:

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 键的键创建查询祖先。我不想使用该解决方案在我的模型中添加字段所有者,因为查询祖先比过滤器更快,它确实有助于我组织数据库。

谢谢

【问题讨论】:

    标签: google-app-engine google-cloud-endpoints endpoints-proto-datastore


    【解决方案1】:

    您可以像这样构造基于祖先的查询:

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

    【讨论】:

    • 好的,谢谢,但我的意思是如果有一种方法可以使用 EndPointModel 的查询并只是“更新”它,或者为祖先查询创建一种过滤器而不是创建一个新的...
    • 我没有完全理解您的上述评论。你能解释一下吗?
    • 在方法 list_model 中,我得到一个对象查询作为参数,该查询已经使用我在装饰器中提到的过滤器创建。我希望从此查询中仅获取祖先“myancestorkey”的子行,而不是创建新查询。
    【解决方案2】:

    使用 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())
    

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多