从Google App Engine中的祖先路径生成密钥

时间:2012-04-17 01:46:45

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

我有一个名为Request的模型。使用父用户创建请求,如下所示:

request = Request(parentUserKey)

现在,用户的key_name是该用户的电子邮件,因此当我创建新用户时,我会这样做:

user = User(key_name = 'abc@gmail.com')

所以我现在要做的是使用Key.from_path为Request创建一个密钥,所以我尝试:

requestKey = Key.from_path('User', 'abc@gmail.com', 'Request', 1)

我放1,因为我将使用此密钥通过以下方式获取ID大于1(或任何其他任意int)的所有请求:

requestQuery.filter("__key__ >", requestKey)

然后出于测试目的,我尝试通过keyString = str(requestKey)将密钥转换为字符串,但是我收到以下错误:

Cannot string encode an incomplete key

我做错了什么?

2 个答案:

答案 0 :(得分:2)

要详细说明Guido所写的内容,完成所有这些工作以手动创建密钥可能不是解决问题的最佳方法。相反,如果您将所有用户的请求实体存储在用户的实体组中,您可以使用祖先查询简单而直接地检索它们。

首先,要使所有Request实体成为User的子项,我们将略微更改实例化Request对象的方式:

request = Request(parent=parentUser) # Where parentuser is a User already in the datastore
# Do whatever else you need to do to initialize this entity
request.put()

现在,要获取属于User的所有Request对象,只需:

requests = Request.all().ancestor(parentUser).fetch(1000)
# Obviously, you want to intelligently manage the condition of having
# more that 1000 Requests using cursors if need be.

能够使用所有路径信息手动创建密钥非常棒,但它通常也比必要的工作更多。

这是否解决了您的用例?

答案 1 :(得分:1)

ID为0的密钥无效。而不是该过滤器,使用祖先查询。