棉花糖循环导入

Circular import in marshmallow

我有两个相互关联的对象。我希望能够通过相关属性通过一个对象访问另一个对象。

例如A.b_relationship.obj.some_property

如何在不创建循环导入的情况下执行此操作?

# lib.py
class Relationship(object):

    def __init__(self, obj):
        self.obj = obj


# a.py
class A(object):
    b_relationship = Relationship(B)

# b.py
class B(object):
    a_relationship = Relationship(A)

为了清楚起见,我添加了这个附加示例。显然 SQLAlchemy 已经通过 backref 属性解决了这个问题。我不确定在不破坏其工作方式的情况下将这种东西应用到棉花糖中的可行性如何。也许我需要改变我的心态?

from marshmallow import Schema
from marshmallow.fields import String

from project.database import db


class PersonModel(db.Model):
    name = db.Column(db.String)


class PetModel(db.Model):
    name = db.Column(db.String)
    owner = db.relationship('PersonModel', backref='pets')


class PersonSchema(Schema):
    name = fields.String(init_arg='some value')
    pets = fields.Relationship(related_schema=PetSchema)


class PetSchema(Schema):
    name = fields.String()
    owner = fields.Relationship(related_schema=PersonSchema)

您可以实施 RelationshipManager(也称为注册表),所有 class 可以成为关系一部分的实体都必须注册。

Relationship 初始化程序可以采用与之相关的 class 的 name,而不是实际的 class 对象。

最后,关系 class 本身可以 lazy-load 真正的 class 它与初始化时给出的名称相关(通过管理器)。

从这里开始: http://marshmallow.readthedocs.org/en/latest/nesting.html#two-way-nesting

查看字符串如何用于class; AuthorSchema 指的是 'BookSchema':

class AuthorSchema(Schema):
    # Make sure to use the 'only' or 'exclude' params
    # to avoid infinite recursion
    books = fields.Nested('BookSchema', many=True, exclude=('author', ))
    class Meta:
        fields = ('id', 'name', 'books')

class BookSchema(Schema):
    author = fields.Nested(AuthorSchema, only=('id', 'name'))
    class Meta:
        fields = ('id', 'title', 'author')

我假设在你的情况下,你想对 many=False 做同样的事情。我从未使用过棉花糖,但在 Django 中,它是相似的,我们使用 class 路径,如 "my_app.MyClass" 而不是 MyClass 以避免循环导入。