Python 递归导入问题

Python recursive import issue

我有一个使用 MongoEngine 作为数据库的 Python/Flask 应用程序。我已经定义了我的模型,并且在添加最新模型之前一切正常。我相信问题的发生是因为两个模型相互引用并且导致递归导入循环。我不确定如何解决它。这将是一个大型项目,其中包含许多相互引用的模型。这种特殊情况是因为用户在实践中,实践中有用户,所以它是多对多关系。

用户模型

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'

我有两个其他模型 运行 属于同一问题。在我将导入添加到另一个模型之前,这些模型工作正常。

简短的回答是不能有循环引用。编译器不相信您会 "bottom out" 正确解析引用,它不会遍历图表来找出答案。

解决此问题的一种方法是使用导入各种 classes 的主 class;你的工人 classes 然后从主人 class.

那里导入他们的需求

我绝不是 MongoEngine 专家,但看起来您可以通过字符串而不是 class 来引用模型。在这种情况下,您可以将 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'))

希望对您有所帮助。