谷歌应用引擎的NDB:获取实体的ID

15

这看起来很简单,但我找不到如何从Google App Engine的ndb中获取实体的id。

class Message(ndb.Model):
    name: ndb.StringProperty()
    ...
创建一个消息对象:
message = Message(id=someId)
message.name = someName
message.put()

等我之后检索实体:

message = Message.query(Message.name==someName).fetch(1)

现在我该如何获取消息的ID?谢谢。

2个回答

38

只要你有key,就可以通过多种方式获取id

fetchget示例

message = Message.query(Message.name==someName).fetch(1)[0]
message_id = message.key.id()

message = Message.query(Message.name==someName).get()
message_id = message.key.id()
如果您仅需要实体的ID而不需要实体本身,则可以仅获取键以节省资源。
message_key = Message.query(Message.name==someName).fetch(1, keys_only=True)[0]
message_id = message_key.id()

message_key = Message.query(Message.name==someName).get(keys_only=True)
message_id = message_key.id()
请记住,您也可以在put之后获得密钥:
message_key = message.put()
message_id = message_key.id()

来自Key类NDB


5
或者在一个put之后加上:message_id = message.put().id() - voscausa
1
@voscausa 是的,但只有在 put() 方法上,因为 put() 方法返回 Key 实例。 - Jimmy Kane

1
尝试使用 get() 获得单个实例。
message = Message.query(Message.name==someName).get()
message.key.id()

fetch() 返回一个列表对象,因此您的代码大致需要这样:

messages = Message.query(Message.name==someName).fetch(1)
message = messages[0]
message.key.id()

1
谢谢。你也可以这样做:message = Message.query(Message.name==someName).fetch(1)[0] - Jimmy Kane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接