NDB模型使用数组过滤器查询密钥ID

Jab*_*key 2 python google-app-engine app-engine-ndb google-cloud-datastore

我正在尝试使用提供的密钥id字符串列表来查询NDB模型.该模型具有在创建时分配的字符串ID - 例如:

objectKey = MyModel(
    id="123456ABC",
    name="An Object"
    ).put()
Run Code Online (Sandbox Code Playgroud)

现在我无法弄清楚如何使用列表过滤器查询NDB密钥ID.通常,您可以执行MyModel.property.IN()来查询属性:

names = ['An Object', 'Something else', 'etc']

# This query works
query = MyModel.query(MyModel.name.IN(names))
Run Code Online (Sandbox Code Playgroud)

当我尝试按键列表进行过滤时,我无法使其工作:

# This simple get works
object = MyModel.get_by_id("123456ABC")

ids = ["123456ABC", "CBA654321", "etc"]

# These queries DON'T work
query = MyModel.query(MyModel.id.IN(ids))
query = MyModel.query(MyModel.key.id.IN(ids))
query = MyModel.query(MyModel.key.id().IN(ids))
query = MyModel.query(MyModel._properties['id'].IN(ids))
query = MyModel.query(getattr(MyModel, 'id').IN(ids))
...
Run Code Online (Sandbox Code Playgroud)

我总是得到AttributeError: type object 'MyModel' has no attribute 'id'错误.

我需要能够按ID列表进行过滤,而不是遍历列表中的每个ID(有时很长).我该怎么做?

Ale*_*lli 8

以下应该有效:

keys = [ndb.Key(MyModel, anid) for anid in ids]
objs = ndb.get_multi(keys)
Run Code Online (Sandbox Code Playgroud)

  • id不是ndb.Key构造函数中的命名参数.所以只需删除`id =`,它就是`keys = [ndb.Key(MyModel,anid),用于ids中的anid]` (4认同)
  • 它只是创建键列表的迭代。它仅通过 get_multi 调用访问数据存储服务一次。这将是比任何查询更有效的方法。 (2认同)