如何在integer_id中使用ndb键?

时间:2013-03-03 16:29:49

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

我看到了这份文件 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()

5 个答案:

答案 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内置函数。也许你错了。