在Google App Engine中基于__key__(唯一标识符)进行选择

1 投票
2 回答
2165 浏览
提问于 2025-04-15 14:18

我又遇到问题了。


""" A site message """
class Message( db.Model ) :
  # from/to/ a few other fields
  subject = db.StringProperty()
  body = db.Text()

  sent = db.DateTimeProperty( auto_now_add=True )

现在我想通过一个键(KEY)来获取一条消息。我之前保存了这个键,并把它放进了一个HTML表单里。结果是生成了一个可以点击的链接,看起来像这样:

<a href="/readmessage?key=aght52oobW1hZHIOCxIHTWVzc2FnZRiyAQw">click to open</a>

然后我运行了这个GQL查询:

gql = """select * from Message where __key__='aght52oobW1hZHIOCxIHTWVzc2FnZRiyAQw'"""

但是它没有成功,因为出现了这个错误:

BadFilterError: BadFilterError: 无效的过滤器:__key__ 过滤器的值必须是一个键;收到的是 aght52oobW1hZHIOCxIHTWVzc2FnZRiyAQw(一个字符串)。

我完全搞不清楚这里的问题所在,我该如何把一个对象放进GQL查询字符串里,而不让Gql解析器认为它是一个字符串呢?

2 个回答

1

你也可以手动构建一个查询,方法是创建一个“实体键字面量,包含...完整的种类和键名/ID路径”。

SELECT * FROM Message WHERE __key__ = KEY('Message', 'message_key')

如果你正在使用数据存储查看器/浏览器,并且不能使用Python语法,这个方法会更加有用。

6

别费心用GQL来根据键来获取数据了——直接从字符串创建一个键对象:

k = db.Key('aght52oobW1hZHIOCxIHTWVzc2FnZRiyAQw')

然后就用 db.get(k) 来获取数据。如果你还是想用GQL,顺便说一下,那个 k——是一个正确构造的 db.Key 实例,可不是字符串对象!-)——这也是你需要放进GQL查询里的(通过 :1 或其他方式)。

撰写回答