0

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

request = Request(parentUserKey)

现在,用户的 key_name 是该用户的电子邮件,所以当我创建一个新用户时,我会:

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

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

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

我究竟做错了什么?

4

2 回答 2

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.

使用所有路径信息手动创建密钥的能力很棒,但它通常也需要做更多的工作。

这是否解决了您的用例?

于 2012-04-17T17:18:05.303 回答
1

id 为 0 的密钥无效。代替该过滤器,使用祖先查询。

于 2012-04-17T04:46:17.297 回答