ndb按ID检索实体密钥而没有父项

Sla*_*waj 7 google-app-engine app-engine-ndb

我想获得一个知道实体ID和祖先的实体密钥.ID在祖先定义的实体组中是唯一的.在我看来,使用ndb接口是不可能的.据我所知,数据存储可能是由于此操作需要执行完整索引扫描.我使用的解决方法是在模型中创建一个计算属性,它将包含键的id部分.我现在可以做一个祖先查询并获取密钥

class SomeModel(ndb.Model):
    ID = ndb.ComputedProperty( lambda self: self.key.id() )

    @classmethod
    def id_to_key(cls, identifier, ancestor):
        return cls.query(cls.ID == identifier,
                         ancestor = ancestor.key ).get( keys_only = True)
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但有没有更好的解决方案来解决这个问题?

更新 似乎对于数据存储,自然的解决方案是使用完整路径而不是标识符.最初我认为这太麻烦了.阅读dragonx后,我重新设计了我的应用程序.令我惊讶的是,现在看起来一切都变得简单了.额外的好处是我的实体将使用更少的空间,我不需要额外的索引.

dra*_*onx 8

我也遇到了这个问题.我想你确实有解决方案.

更好的解决方案是停止使用ID引用实体,并存储实际密钥或完整路径.

在内部,我使用密钥而不是ID.

在我的rest API上,我曾经做过http://url/kind/id(其中id看起来像"123")来获取一个实体.我修改了它以提供实体的完整祖先路径: http://url/kind/ancestor-ancestor-id(789-456-123),然后我解析该字符串,生成密钥,然后按键获取.