通过 KeyProperty 字段从 ndb 查询中获取数据

fetch data from ndb query by KeyProperty field

我有用户模型,另一个模型是用户令牌

 class User(EndpointsModel):
    name = ndb.StringProperty()

    @classmethod
    def get_by_name(cls,name)
         return cls.query(cls.name == name).get()

2 模型是用户令牌

 class Token(EndpointsModel):
    user = ndb.KeyProperty()
    token = ndb.StringProperty()

    @classmethod
    def get_by_user(cls, key):
        return   cls.query(cls.token == key).get()

现在我从用户那里获取数据

  data = User.get_by_name('jaskaran')

当我尝试获取令牌时 return 我 None

 print( Token.get_by_user(data.key) )

这是 return None 我如何在用户 keyProrperty 的帮助下从令牌中获取数据?

我认为您可能正在寻找祖先查询,根据 official documentation,看起来像这样:

如文档中的示例所示:

purchases = Purchase.query(
    Purchase.customer == customer_entity.key).fetch()

这适用于您的用例将类似于:

class Token(EndpointsModel):
    user = ndb.KeyProperty(kind=User) #added kind User in key property, just in case
    token = ndb.StringProperty()

    @classmethod
    def get_by_user(cls, key):
        return   cls.query(cls.token == key).fetch()

###Fetching data 
data = User.get_by_name('jaskaran')

##HERE WILL BE GOOD TO PRINT DATA.KEY, FOR EXAMPLE,
##TO MAKE SURE THAT YOU ARE ACTUALLY RETRIEVING SOMETHING
print(data.key)

print(Token.get_by_user(data.key)

作为旁注,docs 也解释了 Account.get_by_id(...) is faster than Account.query(...).get(),因此删除 .get() 将是对代码的一个很好的更新。