使用Marshmallow嵌套关系进行循环导入

时间:2015-09-24 10:19:02

标签: python flask schema

所以这就是问题所在。想象一下,我有三个架构模块。例如。

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.pyc.py,但我也需要在那里排除关系键。在这种情况下如何避免循环导入?

  • 我知道可以选择将所有内容都包含在一个模块中,但我会将其作为最后的手段。

1 个答案:

答案 0 :(得分:1)

您声明问题在于您无法“将BSchema导入a.py和c.py”,但似乎ASchemaCSchema取决于类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
             )

请注意

  1. 此处“exclude”是fields.Nested()的关键字arg,而不是嵌套Schema

  2. 的关键字
  3. fields.Nested()第一个参数应该是Schema Schema类名,不是 Schema 实例