所以这就是问题所在。想象一下,我有三个架构模块。例如。
a.py
:
from models import A
class ASchema(ModelSchema):
class Meta:
model = A
text = fields.String(required=True)
bs = fields.Nested('BSchema', many=True, dump_only=True)
c.py
:
from models import C
class CSchema(ModelSchema):
class Meta:
model = C
text = fields.String(required=True)
bs = fields.Nested('BSchema', many=True, dump_only=True)
b.py
:
from models import B
class BSchema(ModelSchema):
class Meta:
model = B
text = fields.String(required=True)
as = fields.Nested(ASchema(exclude=ASchema.Meta.model.relations_keys), many=True, dump_only=True)
cs = fields.Nested(CSchema(exclude=CSchema.Meta.model.relations_keys), many=True, dump_only=True)
问题在于我无法将BSchema
导入a.py
和c.py
,但我也需要在那里排除关系键。在这种情况下如何避免循环导入?
答案 0 :(得分:1)
您声明问题在于您无法“将BSchema
导入a.py和c.py”,但似乎ASchema
和CSchema
取决于类B
(未在您的代码段中的任何位置定义),而不是类BSchema
,因此您的一个选项是从“ModelSchema”类定义中拆分“模型”类定义 - 所以你要包“a”,“b”和“c”各有子模块“models.py”和“schemas.py”,“schemas.py”模块取决于“模型”,但“模型”不依赖于“模式”
这就是说,当你有这么紧密的耦合时,它通常意味着你的类真的属于同一个模块......
编辑:看起来你已经将模型放在一个不同的模块中了,所以我真的不明白是什么阻止你直接在“模式”模块中引用模型,即:
# a.py
from wherever import ModelSchema, fields
from models import A, B
class ASchema(ModelSchema):
class Meta:
model = A
text = fields.String(required=True)
bs = fields.Nested(
'BSchema',
exclude=B.relations_keys,
many=True,
dump_only=True
)
# c.py
from wherever import ModelSchema, fields
from models import C, B
class ASchema(ModelSchema):
class Meta:
model = C
text = fields.String(required=True)
bs = fields.Nested(
'BSchema',
exclude=B.relations_keys,
many=True,
dump_only=True
)
# b.py
from wherever import ModelSchema, fields
from models import A, B, C
class BSchema(ModelSchema):
class Meta:
model = B
text = fields.String(required=True)
as = fields.Nested(
"ASchema",
exclude=A.relations_keys,
many=True,
dump_only=True
)
cs = fields.Nested(
"CSchema",
exclude=C.relations_keys,
many=True,
dump_only=True
)
请注意
此处“exclude”是fields.Nested()
的关键字arg,而不是嵌套Schema
和
fields.Nested()
第一个参数应该是Schema
类或Schema
类名,不是 Schema
实例。