Python递归导入问题

时间:2016-12-20 19:42:28

标签: python recursion flask python-import mongoengine

我有一个Python / Flask应用程序,它使用MongoEngine作为数据库。我已经定义了我的模型,一切正常,直到添加了最新的模型。我相信问题的出现是因为两个模型相互引用并导致递归导入循环。我不知道该怎么做才能解决它。这将是一个大型项目,其中许多模型相互引用。这个特殊的例子是因为用户在实践中,而实践中有用户,因此这是一个多对多的关系。

用户模型

from utilities.common import utc_now_ts as now
from mongoengine import *
from models.practice import Practice

class User(Document):
    name = StringField()
    created = IntField(db_field="cr", default=now)
    practices = ListField(ReferenceField(Practice))

和练习模式

from utilities.common import utc_now_ts as now
from mongoengine import *
from models import user

class Practice(Document):
    name = StringField()
    created = IntField(db_field="cr", default=now)
    users = ListField(ReferenceField(user.User))
    admins = ListField(ReferenceField(user.User))

我得到的错误是ImportError: cannot import name 'Practice'

我还有另外两个遇到同样问题的模型。这些模型运行正常,直到我将导入添加到其他模型中。

2 个答案:

答案 0 :(得分:2)

简短的回答是你不能有循环引用。编译器并不相信你会正确地“剔除”#34;关于解析引用,并且它不会遍历图表来查找。

解决此问题的一种方法是使用导入各种类的主类;然后,您的工作类会从主类中导入他们的需求。

答案 1 :(得分:2)

我绝不是MongoEngine的专家,但看起来你可以通过字符串而不是类来引用模型。在这种情况下,您可以将Practice模型更改为这样。

from utilities.common import utc_now_ts as now
from mongoengine import *


class Practice(Document):
    name = StringField()
    created = IntField(db_field="cr", default=now)
    users = ListField(ReferenceField('User'))
    admins = ListField(ReferenceField('User'))

我希望这会有所帮助。