这个NDB查询的兼容版本是什么?

时间:2012-06-19 12:09:24

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

也许这是错的,但我总是将此查询用于我的应用:

cme_only = Comput.all().filter('__key__ =', cid.key())

此NDB查询的兼容版本是什么? 元数据查询非常不同。

修改: cid是一个实体,cme_only是一个可迭代的,我确信它只有一个值

cid = Comput.get_by_id(int(self.request.get('id')))
cme_only = Comput.all().filter('__key__ =', cid.key())

然后在模板中:

{{ for Comput in cme_only }}

我不喜欢它,但它已经足够了

2 个答案:

答案 0 :(得分:7)

不需要元数据查询。在__key__拼写查询的NDB方式如下:

ModelClass.query(ModelClass._key == key_value)

也就是说,就像通过对ModelClass.foo == value进行过滤来查询属性foo一样,ModelClass._key是表示密钥的伪属性。

其他海报是正确的,如果您只有一个实体给定其全密钥,则使用Key对象上的get()方法会更好(更快,更便宜)。此外,如果e是实体(模型实例),则在NDB中,密钥不是e.key()而是e.key(或e._key - 是的,这是相同的_key属性我在上面提到过,它作为一个类属性和一个实例属性工作。)

事实上,如果您有一个urlsafe密钥(例如'agFfcg4LEghFbXBsb3llZRgDDA'),则将其转换为密钥对象的方式为ndb.Key(urlsafe='agFfcg4LEghFbXBsb3llZRgDDA')

祝你好运!

答案 1 :(得分:3)

如果cid是您的实体,那么您可以这样做:

from google.appengine.ext import ndb
cme_only = ndb.Key(Comput, cid.key.id()).get()

但是这将基本上返回与你开始的同一个实体cid,但通常这是按键查询的一种方式。

您可以详细了解如何在文档中construct keys