在Google App Engine中基于__key__(唯一标识符)进行选择
我又遇到问题了。
""" 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
或其他方式)。