AttributeError: 'Key' object has no attribute 'delete'

AttributeError: 'Key' object has no attribute 'delete'

我正在尝试使用下面定义的函数 findpins 从我的数据存储中删除一批单一种类的实体。参数 limit 指示要删除的 Kind Pin 中的实体数。 实际上,limit 将略低于 20000,以使每日删除免费。我正在执行 keys_only 查询以避免读取每个实体。

但是在测试我的代码时出现以下错误。

AttributeError: 'Key' object has no attribute 'delete'

更新 0 如果我使用 print pin 而不是 pin.delete(),我会看到两个 80 个字符的字符串,我认为它们是 2 个键。但是我不知道如何使用Keys进行删除。

更新 1 如果我使用 keys_only=False 而不是 keys_only=True,我将完成删除。但后来我遇到了一个潜在的读取费用,这是昂贵的。对吗?

我该如何解决这个问题?

如果您发现我的策略存在其他问题,也请指出。

更新 2 我根据 @jccampanero 的建议修改的 Python 代码很有前途,但由于其参数 Model 目前在 isinstance 中失败] 和 Key。首先我收到错误消息 NameError: global name 'Model' is not defined。但是当我用 Pin 替换 Model 时,我得到错误 NameError: global name 'Key' is not defined 并且我无法想象用什么替换 Key 。我不知道我在用这些新定义做什么,而且我对参数 **kwargs 特别不舒服。所以我真的可以在这里使用一些帮助。我在正确的轨道上吗?

Python 代码(编辑了 2 个新导入、2 个新定义和 1 个新删除命令):

import os
import pprint

from google.appengine.ext import db
from google.appengine.api import datastore
from google.appengine.datastore import datastore_rpc
def delete_async(models, **kwargs):
  if isinstance(models, (basestring, Model, Key)):
    models = [models]
  else:
    try:
      models = iter(models)
    except TypeError:
      models = [models]
  keys = [_coerce_to_key(v) for v in models]

  return datastore.DeleteAsync(keys, **kwargs)

def delete(models, **kwargs):
  delete_async(models, **kwargs).get_result()



class Pin(db.Model):
    name = db.StringProperty()


def findpins(limit):
    pin_query = Pin.all(keys_only=True) 
    for pin in pin_query.run(limit=limit):
        # was: pin.delete()
        delete(pin)
findpins(2)

根据库的源代码,您可以为此目的使用 delete 函数:它接受要删除的记录的键。

请考虑在您的代码中进行以下修改(注意上述 db.delete 函数的使用):

import os
import pprint

from google.appengine.ext import db
class Pin(db.Model):
    name = db.StringProperty()

def findpins(limit):
    pin_query = Pin.all(keys_only=True) 
    for pin in pin_query.run(limit=limit):
        db.delete(pin)
findpins(2)