如何避免Python Google App Engine Ndb中的循环导入(模式要避免)

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

当我试图执行这样的代码import Parent时,它会产生异常:

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'


可以替换需要parent导入children的查询,即

1
children.Child.query(Child.parent == self.key)

使用GQL查询,只需字符串即可满足:

1
ndb.gql('SELECT * FROM Child WHERE parent = :1').bind(self.key)