【问题标题】:Unable to access ID property from a datastore entity无法从数据存储实体访问 ID 属性
【发布时间】:2011-01-14 04:35:42
【问题描述】:

使用 Google App Engine SDK 和 Python,我遇到了一个问题:我无法访问给定实体属性的 ID 属性。我可以访问的唯一属性是在我的类 Model 中定义的属性,以及 key 属性(请参阅下面的答案):

class Question(db.Model):
    text = db.StringProperty()
    answers = db.StringListProperty()
    user = db.UserProperty()
    datetime = db.DateTimeProperty()

我可以很好地访问文本、答案、用户、日期时间和关键属性。但是,我无法访问 ID 属性。 例如,在获取所有实体之后(使用 Question.all()):

# OK Within a template, this will return a string :
{{ question.text }}
# OK, this will return the entity key :
{{ question.key }}

# KO this will return nothing :
{{ question.id }}

有什么想法吗?谢谢!

【问题讨论】:

  • key 和 id 不是数据存储实体的属性。 key() 是实例方法,id() 是 Key 的实例方法。 {{entity.key.id}} 仅有效,因为 .在适当的时候将被解释为方法调用。

标签: python google-app-engine entity google-cloud-datastore


【解决方案1】:

根据documentation,没有为Model子类定义id()实例方法。

改用{{ question.key }}

另请注意,在将实体保存到数据存储区之前不会创建密钥。


编辑:更多信息基于 OP 的编辑:

由于我们真的是在数字 ID 之后,我们可以在我们的模板中做这样的事情:

{{ question.key.id }}

另一个注意事项:您永远不应期望数字 ID 的值会随着实体创建的顺序而增加。在实践中,这通常是——但并非总是如此。

【讨论】:

  • 确实,{{ question.key }} 工作正常并返回存储在数据存储区中的密钥。我应该仔细检查!我可能会编辑我的原始帖子。所以我想检索 ID 是剩下的唯一问题了。
  • @Sorw:随时。欢迎来到 SO。
  • @bernie,这正是我想要的,我花了将近两个小时搜索。
  • 很高兴你找到了这个。快乐编码
【解决方案2】:

我刚刚找到了一个可能的(不雅的,IMO)解决方案。查询和获取实体后,遍历所有实体并手动添加 id 参数:

query = Question.all()
questions = query.fetch(10)

# Add ID property :
for question in questions:
    question.id = str(question.key().id())

我认为它在 CPU 方面效率不高,但它可以作为一种快速/肮脏的修复。

【讨论】:

  • @Adam:呵呵,我想我们俩同时找到了一个可能的解决方案,但你的要简单得多!
  • 可能不太优雅,但为您找到解决方案 +1。
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多