2

我看到文档 https://developers.google.com/appengine/docs/python/ndb/keyclass#Key_integer_id

返回最后一个 (kind, id) 对中的整数 id,如果键具有字符串 id 或不完整,则返回 None。

看到我认为键的 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)

似乎是对的;

所以我的问题是,如何使用带有 integer_id 的 ndb 键?

模型是

class UserSession(ndb.Model):
    session = ndb.BlobProperty()
4

5 回答 5

10

您在读取实体时使用的 id 的类型必须与您在编写实体时使用的 id 的类型相匹配。通常,当您编写新实体而不指定 id 或键时,会自动分配整数 id;然后从 entity.put() 返回的键中获取 id。一般不建议分配自己的整数id;当应用程序分配键时,约定是它们应该是字符串。

于 2013-03-04T15:46:48.980 回答
1

有一种更简单的获取方法:

UserSession.get_by_id(int(id))

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_by_id

如果这不起作用,我怀疑那id是错误的或空的。

于 2013-03-04T02:57:40.397 回答
0

在会话中使用它们的键而不是它们的 ID 来识别您的实体可能更容易。确实没有必要从密钥中提取 ID 来识别会话(除了可能节省一点内存。我认为您的思维方式是基于 RDB。我了解到使用密钥实际上可以识别实体/会话更轻松。

于 2013-03-04T13:02:49.623 回答
0

您的变量“id”一定有问题。

你这里的代码应该没问题,最好用long而不是int。

您可以在具有特定整数 id 的开发服务器的交互式控制台上尝试您的代码。

于 2013-03-04T11:44:01.693 回答
0

'id' 也是一个 python 内置函数。也许你误会了。

于 2014-01-24T14:55:12.843 回答