我有一个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'
我还有另外两个遇到同样问题的模型。这些模型运行正常,直到我将导入添加到其他模型中。
答案 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'))
我希望这会有所帮助。