我正在通过将模型从一个大文件拆分为多个文件来重构我们的模型模块。试图绕过单个文件引入的不可避免的依赖循环很困难,但是我们设法了。
现在,令我们惊讶的是,在测试实例上测试新代码时,我们遇到了KindError: No model class found for kind 'Foo'. Did you forget to import it?
错误。
由于我们的单元测试都是绿色的,我们认为必须是因为现有的条目存储了对模型类的“旧”引用。
将问题缩小到ndb.Model的_kind_map
属性需要一些时间。我很困惑这个地图何时在内部更新?何时/如何AppEngine决定将模型类添加到此地图?
我们正在通过为临时处理程序中的每个模型显式调用_fix_up_properties()
方法来尝试一种解决方法,但我不确定这是否可取,如果没有任何意外的副作用,线。
修改
我尝试在2个不同版本的应用上打印_kind_map.keys()
。一个是旧的非重构版本,另一个是重构版本。
在旧版本中,所有型号都列为按键(39个型号)。在重构版本上,它只列出了5个模型。这5个模型是在用于打印密钥的处理程序上导入的唯一模型。所以我想每次导入模型时都会更新地图?但为什么非重构版本打印出39?要打印的处理程序也只在那里导入5个模型。
答案 0 :(得分:2)
2012年Guido van Rossum posted
包含Account的类定义的模块很可能是 不执行(直接或间接)执行代码的代码 get()请求。添加导入应该会使问题消失。 (这个 是因为在模型类定义时更新了种类映射 读即可。仅给出类型名称,例如'帐户',NDB不知道 要导入哪个模块以查找模型类。
如果您从其他模块导入模型,例如models.MyKind,那么NDB无法识别' MyKind'仅作为一种模特.MyKind'。
以下生成KindError,
import models
import ndb
key = ndb.Key(urlsafe=encoded_key)
entity = key.get() #KindError
将最后两行移至models.py,例如@staticmethod,它可以正常工作。 可能有更好的解决方案。
答案 1 :(得分:0)
我的解决方案是将特定模型导入重构模块:
from models import Foo
这会更新该模块中代码的_kind_map
。