我正在尝试在Python Google App Engine Ndb数据存储架构中找到避免循环导入的模式。我希望单独的文件哪个父模式和子模型(与父模型相关)。
我找到的唯一选项是将父项和子项连接到一个文件中,但它使代码过于复杂,不易扩展(添加更多行)。
目前我有这样的项目结构。
parent.py - parent entity
base.py - abstract base entity for children
children.py - children module
我读到了这个答案How to avoid circular imports in Python?并尝试使用但没有成功就是O.K.使用典型的Python 对象但不适用于已初始化的 ndb属性。我花了几个小时但不知道为什么它不起作用。
parent.py (需要子项删除依赖项)
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 (需要父级参考)
from google.appengine.ext import ndb
import parent
class BaseChild(ndb.Model):
parent = ndb.KeyProperty(kind=parent.Parent)
children.py (需要基地也需要家长)
import base
class Child(base.BaseChild):
pass
当我尝试执行此类代码import Parent
时会产生异常:
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'
答案 0 :(得分:1)
您可以替换需要parent
导入children
的查询,即
children.Child.query(Child.parent == self.key)
使用GQL
查询,只对字符串感到满意:
ndb.gql('SELECT * FROM Child WHERE parent = :1').bind(self.key)