4

互いに関連する 2 つのオブジェクトがあります。関連する属性を介して、あるオブジェクトから別のオブジェクトにアクセスできるようにしたいと考えています。

例えば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)
4

2 に答える 2

8

ここから: http://marshmallow.readthedocs.org/en/latest/nesting.html#two-way-nesting

クラスで文字列がどのように使用されているかを確認してください。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 でも同様MyClassです。循環インポートを避ける代わりに、"my_app.MyClass" のようなクラス パスを使用します。

于 2016-01-25T21:44:17.413 に答える