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

时间:2015-08-06 09:45:28

标签: python google-app-engine google-cloud-datastore python-import app-engine-ndb

我正在尝试在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'

1 个答案:

答案 0 :(得分:1)

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

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

使用GQL查询,只对字符串感到满意:

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