GAE:从密钥获取实体时出现 Cloud Datastore KindError

GAE: Cloud Datastore KindError when getting entity from key

我在 GAE Python2 上有一个应用 运行。7 使用 Datastore 的标准环境。

我们数据存储的实体类型目前基于 'appname_classname'(小写)的命名约定。

种类
- common_account(在 "common" 应用的帐户 class 下)
- common_animal(在 "common" 应用程序的动物 class 下)

这种命名约定是由于框架(kay framework)的特点。 只要我使用的是 kay 框架,就不会出现如下所示的实体错误。

from google.appengine.ext import db
from common.models import Animal
lst = [e for e in Animal.all()]
animal = lst[0]
db.get(str(animal.key()))

但这次我使用现有 Datastore 的数据创建了一个基于 Flask 的新项目。 所以我从当前项目中导出所有实体并将它们导入到新项目中。

我用 __name__ 重命名了 class。

from google.appengine.ext import db
class BaseModel(db.Model):
    created_at = db.DateTimeProperty(auto_now_add=True)
    updated_at = db.DateTimeProperty(auto_now=True)
    is_deleted = db.BooleanProperty(default=False)

class Animal(BaseModel):
    name = db.StringProperty()
    number = db.IntegerProperty()

Animal.__name__ == 'common_animal'

自从我将 Animal class 的名称更改为 'common_animal'。

后,我能够使用下面的查询获得种类 'common_animal' 的实体
lst = [e for e in Animal.all()]

但是当我尝试使用 db.get() 获取实体时,我得到了 KindError。为什么即使我将 Animal class 名称更改为 'common_animal.

也会出现 KindError
from google.appengine.ext import db
from common.models import Animal
lst = [e for e in Animal().all().fetch(limit=100)]
animal = lst[0]
db.get(str(animal.key()))
KindError: No implementation for kind 'common_animal'

看起来错误来自 'google-cloud-sdk/platform/google_appengine/google/appengine/ext/db/init.py' 的 class_for_kind。 _kind_map 没有识别 __name__,应该是 'common_animal'

pp _kind_map
{'Animal': <class 'common.models.Animal'>,
 'BaseModel': <class 'common.models.BaseModel'>,
 'Division': <class 'common.models.common_division'>,
 'Expando': <class 'google.appengine.ext.db.Expando'>,
 'Model': <class 'google.appengine.ext.db.Model'>,
 '__BlobMigration__': <class 'google.appengine.ext.blobstore.blobstore.BlobMigrationRecord'>}

您需要覆盖模型 class 上的 kind() 方法,而不是设置 __name__。参考文档位于 https://cloud.google.com/appengine/docs/standard/python/datastore/modelclass#Class_Methods .

NDB transition 文档含糊地给出了一个示例。