无法访问数据存储实体的ID属性

7 投票
2 回答
2096 浏览
提问于 2025-04-15 19:00

我在使用Google App Engine SDK和Python时遇到了一个问题:我无法访问某个实体属性的ID。现在我能访问的属性只有我在模型类中定义的那些,还有一个键属性(下面会有详细说明):

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 }}

有什么想法吗?谢谢!

2 个回答

5

我刚找到一个可能的(我觉得不太优雅)解决办法。在查询并获取到所有的实体后,逐个遍历它们,然后手动添加id参数:

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

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

我觉得这样做在CPU使用上可能不是很高效,但作为一个快速的临时解决方案,它是有效的。

11

根据文档,Model类的子类没有定义id()这个实例方法。

你可以试试用{{ question.key }}来代替。

另外要注意,只有在实体保存到数据存储后,键(key)才会被创建。


编辑:根据提问者的更新,提供更多信息:

因为我们真正想要的是数字ID,所以在我们的模板中可以这样做:

{{ question.key.id }}

还有一点要注意:你永远不要指望数字ID会随着实体创建的顺序而递增。实际上,通常是这样,但并不总是如此。

撰写回答