我有一个名为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
我做错了什么?
答案 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的密钥无效。而不是该过滤器,使用祖先查询。