[GAE:从密钥获取实体时,Cloud Datastore KindError

问题描述 投票:0回答:1

我有一个使用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'>}
python-2.7 google-app-engine flask google-cloud-datastore app-engine-ndb
1个回答
0
投票

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

NDB transition文档含糊其词。

© www.soinside.com 2019 - 2024. All rights reserved.