我有一个使用Datastore在GAE Python2.7 Standard环境上运行的应用程序。
我们的数据存储区的实体类型当前基于'appname_classname'(小写)的命名约定。
种类-common_account(在“通用”应用的“帐户”类别下)-common_animal(在“常用”应用的Animal类下)
此命名约定归因于框架(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()))
但是这次我使用现有数据存储区的数据在Flask的基础上创建了一个新项目。因此,我从当前项目中导出了所有实体,并将它们导入到新项目中。
并且我使用__name__重命名了班级。
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类的名称更改为'common_animal',因此我可以使用下面的查询来获取'common_animal'类的实体。
lst = [e for e in Animal.all()]
但是当我尝试使用db.get()获取实体时,我得到了KindError。为什么什至以为我将Animal类名更改为'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'>}
您将要在模型类上覆盖kind()方法,而不是设置__name__。参考文档位于https://cloud.google.com/appengine/docs/standard/python/datastore/modelclass#Class_Methods。
NDB transition文档含糊其词。