类属性中的Python循环导入

时间:2018-12-12 19:16:03

标签: python python-3.x dependency-injection circular-dependency peewee

我有以下文件:

user.py

...
from models.company import Company

class User(BaseModel):
    company = ForeignKeyField(Company, ...)
...

company.py

...
from models.user import User

class Company(BaseModel):
    user = ForeignKeyField(User, ...)
...

就python而言,这是正常的循环导入错误。问题是通常的解决方法(将import语句放在文件末尾,以不同的方式导入等)在这种情况下不起作用,因为我在类属性的定义中使用了一个类另一个班级。

在这种情况下解决周期性导入错误的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

事实证明,正如@PatrickHaugh指出的那样,这实际上不可能

  

请注意,您不能在编写它们的同一个文件中同时定义它们。当您执行第一个定义时,它将失败,因为无论您先定义哪个类,都尚未定义另一个类的名称。 ForeignKeyField来自哪个框架?它可能具有避免此问题的工具。

由于我使用peewee作为我的ORM,因此为此目的建立了一个特殊的字段:DeferredForeignKey

因此,最终,解决方案是:

user.py

...
from models.company import Company

class User(BaseModel):
    company = ForeignKeyField(Company, ...)
...

company.py

...
class Company(BaseModel):
    user = DeferredForeignKey('User', ...)
...