簡體   English   中英

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'

我還有另外兩個遇到相同問題的模型。 在將導入添加到其他模型之前,這些模型運行良好。

簡短的答案是您不能有循環引用。 編譯器不相信您會在解析引用時正確地“自下而上”,並且不會遍歷該圖進行查找。

解決此問題的一種方法是使用導入各種類的主類。 您的工人班級然后從大師班級導入他們的需求。

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

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM