【问题标题】:What is the compatible version of this query for NDB?NDB 这个查询的兼容版本是什么?
【发布时间】:2012-06-19 12:09:24
【问题描述】:

也许这是错误的,但我总是在我的应用中使用这个查询:

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

我不喜欢,但已经够了

【问题讨论】:

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


    【解决方案1】:

    不需要元数据查询。在__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'),那么将其转换为 Key 对象的方法是 ndb.Key(urlsafe='agFfcg4LEghFbXBsb3llZRgDDA')

    祝你好运!

    【讨论】:

    • 感谢 Guido,我会努力完成向 ndb 的过渡。
    【解决方案2】:

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

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

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

    您可以在文档中查看有关如何construct keys 的更多信息。

    【讨论】:

    • 什么是cid?如果它是一个 ndb 模型,那么它应该是 cid.key... 而不调用它。
    • @aschmid00 这就是我的假设.. 让我们等待 OP,我会相应地更改它..
    • cid 是一个实体cid = Comput.get_by_id(int(self.request.get('id')))
    • 如果 cid 是 NDB 实体(ndb.Model 子类实例),则 cid.key 是 Key 对象,而 ndb.Key(Comput, cid.key) 是无意义的——ndb 的第二个参数。 Key() 必须是一个 int 或一个字符串,而不是另一个 Key。
    • @GuidovanRossum True.. 当我更改它时忘记了 id().. 但是当您已经将 cid 作为 NDB 实体时使用它仍然没有意义..跨度>
    猜你喜欢
    • 2018-11-09
    • 2023-02-14
    • 2011-08-15
    • 2011-08-12
    • 2021-08-15
    • 2010-12-07
    • 2010-09-20
    • 2019-09-13
    • 2021-06-29
    相关资源
    最近更新 更多