我看到了这份文件 https://developers.google.com/appengine/docs/python/ndb/keyclass#Key_integer_id
返回最后一个(kind,id)对中的整数id,如果是键,则返回None 有字符串ID或不完整。
看我认为一个键的id可以是一个int;所以我写了
r = ndb.Key(UserSession, int(id)).get()
if r:
return r.session
但dev_server.py将始终提升
File "/home/bitcoin/down/google_appengine/google/appengine/datastore/datastore_stub_util.py", line 346, in CheckReference
raise datastore_errors.BadRequestError('missing key id/name')
BadRequestError: missing key id/name
我支持int(id) - > STR(ID)
似乎没错;
所以我的问题是,如何将ndb键与integer_id一起使用?
模型是
class UserSession(ndb.Model):
session = ndb.BlobProperty()
答案 0 :(得分:10)
读取实体时使用的ID类型必须与写入实体时使用的ID类型相匹配。通常,在编写新实体时自动分配整数id,而不指定id或key;然后从entity.put()返回的密钥中获取id。通常不建议分配您自己的整数ID;当应用程序分配密钥时,惯例是它们应该是字符串。
答案 1 :(得分:1)
有一种更简单的获取方式:
UserSession.get_by_id(int(id))
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_by_id
如果这不起作用,我怀疑id
错误或为空。
答案 2 :(得分:0)
变量'id'一定有问题。
这里的代码应该没有问题,用户使用long代替int。
您可以在具有特定整数ID的开发服务器的交互式控制台上尝试您的代码。
答案 3 :(得分:0)
使用密钥而不是ID来识别会话中的实体可能更容易。确实没有必要从密钥中提取ID来识别会话(除了可能保存 bit 的内存。我认为你的想法基于RDB。我学到了使用密钥实际上使实体/会话标识更容易。
答案 4 :(得分:0)
'id'也是一个python内置函数。也许你错了。