How can I avoid circular imports in Python Google App Engine Ndb (pattern to avoid)
我试图在python google应用引擎ndb数据存储体系结构中找到避免循环导入的模式。我想有单独的文件,父模式和子模型(与父模式相关)。
我找到的唯一选择是将父级和子级联接到一个文件中,但这会使代码过于复杂,不容易缩放(添加更多行)。
目前我有这样的项目结构。
1 2 3 | parent.py - parent entity base.py - abstract base entity for children children.py - children module |
我读过这个答案,如何避免在python中循环导入?尝试使用但没有成功,这对于典型的Python对象来说是可以的,但不适用于初始化的ndb属性。我花了几个小时,但不知道为什么它不起作用。
parent.py(删除依赖项需要子项)
1 2 3 4 5 6 7 8 | import children from google.appengine.ext import ndb class Parent(ndb.Model): def deleteWithChildren(self): for child in children.Child.query(Child.parent == self.key).fetch(): child.key.delete() self.key.delete() |
号
base.py(需要父级作为参考)
1 2 3 4 5 | from google.appengine.ext import ndb import parent class BaseChild(ndb.Model): parent = ndb.KeyProperty(kind=parent.Parent) |
children.py(need base也需要parent)
1 2 3 4 | import base class Child(base.BaseChild): pass |
。
当我试图执行这样的代码
1 2 3 4 5 6 7 8 9 10 11 | File"sandbox\sandbox.py", line 6, in <module> from web_site.seo.frontend.sandbox.parent import Parent File"sandbox\parent.py", line 4, in <module> import children File"sandbox\children.py", line 4, in <module> import base File"sandbox\base.py", line 7, in <module> class BaseChild(ndb.Model): File"sandbox\base.py", line 8, in BaseChild parent = ndb.KeyProperty(model=parent.Parent) AttributeError: 'module' object has no attribute 'Parent' |
可以替换需要
1 | children.Child.query(Child.parent == self.key) |
使用
1 | ndb.gql('SELECT * FROM Child WHERE parent = :1').bind(self.key) |
号