【问题标题】:google app engine's ndb: get an entity's idgoogle app engine ndb:获取实体的 id
【发布时间】:2013-01-05 16:16:45
【问题描述】:

这看起来很简单,但我只是没有找到如何从 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?谢谢。

【问题讨论】:

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


    【解决方案1】:

    如果您拥有 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 Class NDB

    【讨论】:

    • 或在 put 之后:message_id = message.put().id()
    • @voscausa 是的,但只在 put 上,因为 put() 返回 Key 实例
    【解决方案2】:

    尝试使用 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()
    

    【讨论】:

    • 谢谢。你也可以这样做:message = Message.query(Message.name==someName).fetch(1)[0]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多