Python递归导入问题

Python递归导入问题,python,recursion,flask,python-import,mongoengine,Python,Recursion,Flask,Python Import,Mongoengine,我有一个Python/Flask应用程序,它使用MongoEngine作为数据库。我已经定义了我的模型,在添加最新的模型之前,一切都正常工作。我认为出现这个问题是因为两个模型相互引用,导致了递归导入循环。但我不知道该怎么解决这个问题。这将是一个大型项目,有许多模型相互引用。这个特殊的实例是因为用户在实践中,实践中有用户,所以这是一种多对多关系 用户模型 from utilities.common import utc_now_ts as now from mongoengine import *

我有一个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))
我得到的错误是导入错误:无法导入名称“实践”


我还有另外两个模型遇到了同样的问题。在我将导入添加到另一个模型之前,这些模型工作得很好。

简单的回答是,不能使用循环引用。编译器不相信您在解析引用时会正确地“自底向上”,而且它也不会遍历图来找出答案


解决这个问题的一种方法是使用一个主类来导入各种类;然后,您的工人类从主类导入他们的需求。

简单的回答是,您不能有循环引用。编译器不相信您在解析引用时会正确地“自底向上”,而且它也不会遍历图来找出答案


解决这个问题的一种方法是使用一个主类来导入各种类;然后,您的工人类从主类导入他们的需求。

我绝对不是MongoEngine方面的专家,但看起来您可以通过字符串而不是通过类引用模型。在这种情况下,您可以将
练习
模型更改为如下所示

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'))

我希望这能有所帮助。

我绝对不是MongoEngine方面的专家,但看起来您可以通过字符串而不是类引用模型。在这种情况下,您可以将
练习
模型更改为如下所示

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'))

我希望这能有所帮助。

它们被递归引用有什么原因吗?解决此问题的最佳方法很可能是通过模型重构来删除其中一个依赖项。您能告诉我如何更改它吗?我需要每个模型的用户列表,我需要每个用户的组列表。这是我搜索主题时人们推荐的方法。它们被递归引用有什么原因吗?解决此问题的最佳方法很可能是通过模型重构来删除其中一个依赖项。您能告诉我如何更改它吗?我需要每个模型的用户列表,我需要每个用户的组列表。这是人们在我搜索这个主题时推荐的方法。假设这是我仅有的两门课,你能给我一个关于大师课的例子吗。试试讨论[这里]()假设这是我仅有的两门课,你能给我一个关于大师课的例子吗。试试讨论[这里]()