【问题标题】:NDB Model Querying of Key Ids using an array filter使用数组过滤器的键 ID 的 NDB 模型查询
【发布时间】:2014-12-31 00:49:21
【问题描述】:

我正在尝试使用提供的键 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(有时很长)。我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    以下应该有效:

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

    【讨论】:

    • 抛出以下TypeError: _parse_from_args() got an unexpected keyword argument 'id'
    • 另外,这是对 id 列表的迭代,我试图避免这种情况(这是在延迟任务上执行的,并且有执行限制)。
    • 它只是创建键列表的迭代。它只通过 get_multi 调用访问 datatstore 服务一次。这将是一种比任何查询都更有效的方法。
    • id 不是 ndb.Key 构造函数中的命名参数。所以只需删除id=,它将是keys = [ndb.Key(MyModel, anid) for anid in ids]
    • @TimHoffman 你是对的,在 Key(kind1, id1, ...) ctor 中,我同时使用了 kindid 参数仅是位置的——感谢您发现这一点,编辑修复。
    【解决方案2】:

    如果您在使用 id 时遇到问题,也可以使用 urlsafe 密钥。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      相关资源
      最近更新 更多