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

时间:2014-12-31 00:49:22

标签: python google-app-engine app-engine-ndb google-cloud-datastore

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

objectKey = MyModel(
    id="123456ABC",
    name="An Object"
    ).put()

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

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

# This query works
query = MyModel.query(MyModel.name.IN(names))

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

# 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))
...

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

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

2 个答案:

答案 0 :(得分:7)

以下内容应该有效:

keys = [ndb.Key(MyModel, anid) for anid in ids]
objs = ndb.get_multi(keys)

答案 1 :(得分:0)

您还可以使用urlsafe密钥如果您在使用ID时遇到问题。

keys = ndb.get_multi([ndb.Key(urlsafe=k) for k in ids])