2012-04-17 92 views
0

我有一个名为Request的模型。请求与父用户创建的,像这样:在Google App Engine中从祖先路径生成密钥

request = Request(parentUserKey) 

现在,对于用户的KEY_NAME是用户的电子邮件,所以当我创建一个新用户,我做的:

user = User(key_name = '[email protected]') 

那么什么我想现在要做的就是创建一个使用Key.from_path的请求的关键,所以我尝试:

requestKey = Key.from_path('User', '[email protected]', 'Request', 1) 

我把1,因为我会用此键来获取ID为高于1的所有请求(或任何其他任意int)通过以下方式:

requestQuery.filter("__key__ >", requestKey)

然后用于测试目的,我尝试通过keyString = str(requestKey)的键转换为字符串,但我得到了以下错误:

Cannot string encode an incomplete key

我在做什么错?

+0

是0有效吗? – dragonx 2012-04-17 03:10:04

回答

2

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

首先,让所有用户的请求实体孩子,我们要稍微改变,你实例化一个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() 

现在,让所有的请求的对象是属于用户,您刚:

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

带0的密钥无效。而不是那个过滤器,使用祖先查询。

+0

0是任意的。为了这个问题,我只是把它放在那里。我会将其更改为1 – Snowman 2012-04-17 11:43:46

+0

虽然0和1之间有很大差异。用0,str(key)将引发一个异常,并引用你所引用的消息。用1,它将返回一个有效的编码密钥。 – 2012-04-17 17:55:23

相关问题