1

依存関係のサイクル/三角形を形成するネストされたフィールドを持つ 3 つのマシュマロ スキーマがあります。two-way nestingのボイラープレートを使用すれば、問題はないようです。

from marshmallow import Schema, fields
class A(Schema):
    id = fields.Integer()
    b = fields.Nested('B')

class B(Schema):
    id = fields.Integer()
    c = fields.Nested('C')

class C(Schema):
    id = fields.Integer()
    a = fields.Nested('A')

ただし、次のような fields.Nested の独自の薄いサブクラスがあります。

from marshmallow import fields
class NestedRelationship(fields.Nested):

    def __init__(self, nested,
                 include_data=True,
                 **kwargs):

        super(NestedRelationship, self).__init__(nested, **kwargs)

        self.schema.is_relationship = True
        self.schema.include_relationship_data = include_data

Nestedそして、ネイティブ型の代わりに NestedRelationship を使用するように各スキーマを変更すると、次のようになります。

marshmallow.exceptions.RegistryError: Class with name 'B' was not found. You may need to import the class.

NestedRelationship は比較的薄いサブクラスであり、動作の違いに驚いています。ここで何か間違ったことをしていますか?スーパーを適切に呼び出していませんか?

4

1 に答える 1

0

問題は、にアクセスする余分なコードにありますself.schema。フィールドを定義するA.bと、フィールドを解決しようとしますが、まだ定義されていません。一方、marshmallow.fields.Nested構築時にスキーマを解決しようとしないため、この問題はありません。

于 2016-11-30T23:50:48.760 に答える