2017-12-06 12 views
0

나는 개체의 계층 구조와 이에 해당하는 스키마 계층 구조를 가지고 있습니다. 이 계층 구조의 중간 레벨에있는 스키마는 상속 된 특정 필드를 제외합니다. 그 스키마는이 배제를 "상속"합니다 그것으로부터 상속 기대하는, 그러나 이것은 그들의 메타 클래스에 자신의 제외 필드를 추가 할 경우 사건이 될 것 같습니다하지 않습니다 :수퍼 스키마 (marshmallow)에서 "exclude"메타 매개 변수 상속

예에서
from marshmallow import fields 
from marshmallow.schema import Schema 


class AncestorSchema(Schema): 
    a = fields.Str() 
    b = fields.Str() 


class IntermediateSchema(AncestorSchema): 
    c = fields.Str() 

    class Meta: 
     exclude = ('b',) 


class FinalSchema(IntermediateSchema): 
    d = fields.Str() 

    class Meta: 
     exclude = ('c',) 


value = dict(
    a="Field A", 
    b="Field B", 
    c="Field C", 
    d="Field D" 
) 

print(IntermediateSchema().dump(value).data) 

>>> {'c': 'Field C', 'a': 'Field A'} 

print(FinalSchema().dump(value).data) 

>>> {'d': 'Field D', 'a': 'Field A', 'b': 'Field B'} 

위, FinalSchema 상속을에서 IntermediateSchema (필드 b 제외)이며 클래스의 c 필드는 제외됩니다. 예상되는 동작은 결과 스키마가 bc을 모두 제외하지만 실제로는 c 만 제외한다는 것입니다.

물론 superschema의 제외 필드는 상속되는 스키마의 제외 된 필드를 수동으로 포함 할 수 있지만 상속의 대상이 아니며 성가신 일입니다.

원하는 동작을 우아한 방법으로 구현할 수 있는지 또는 스키마 상속의 현재 동작이 실제로 버그인지 궁금합니다.

marshmallow의 소스 코드를 검사하면 superschemas의 메타 클래스에서 데이터의 상속이 부분적으로 지원된다는 것을 알 수 있습니다 (즉, ordered 메타 옵션 값이 superschemas에서 상속 됨).

답변

1

이 질문에 3 달이되었으므로이 사용자는 이미 답변을 찾았지만 Google과 같은 사람들로부터 이익을 얻으려면 Meta 클래스의 기본 클래스를 지정해야합니다. 또한 기본 클래스에서 값을 가져 와서 추가하려면 일종의 리플렉션을 사용해야합니다.

from marshmallow import fields 
from marshmallow.schema import Schema 


class AncestorSchema(Schema): 
    a = fields.Str() 
    b = fields.Str() 


class IntermediateSchema(AncestorSchema): 
    c = fields.Str() 

    class Meta: 
     exclude = ('b',) 


class FinalSchema(IntermediateSchema): 
    d = fields.Str() 

    class Meta(IntermediateSchema.Meta): 
     exclude = self.__bases__[0].exclude + ('c',)