【问题标题】:Python recursive import issuePython递归导入问题
【发布时间】:2016-12-20 19:42:27
【问题描述】:

我有一个使用 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'

我还有两个遇到相同问题的模型。在我将导入添加到另一个模型之前,这些模型运行良好。

【问题讨论】:

  • 是否有递归引用它们的原因?解决此问题的最佳方法很可能是模型重构以删除其中一个依赖项。
  • 你能告诉我如何改变它吗?我需要为每个模型创建一个用户列表,并且我需要为每个用户创建一个组列表。这是我搜索该主题时人们推荐的方法。

标签: python recursion flask python-import mongoengine


【解决方案1】:

我绝不是 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'))

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    简短的回答是你不能有循环引用。编译器不相信您会在解析引用时正确地“触底”,它不会遍历图表来找出答案。

    解决此问题的一种方法是使用导入各种类的主类;然后你的工人班从大师班导入他们的需求。

    【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2010-12-08
    • 2021-03-17
    相关资源
    最近更新 更多