Marshmallow: почему я не могу получить доступ к атрибутам полей?

#python #marshmallow #flask-marshmallow

#python #marshmallow #flask-marshmallow

Вопрос:

У меня есть довольно обычный класс схемы, например:

 class TestSchema(db_schema.SQLAlchemyAutoSchema):
    xxx = fields.Str()
    name = fields.Str(validate=validate.Length(min=1), required=True, error_messages={"required": "The name is required."})
    class Meta:
        fields = ('id', 'name', 'description')
        model = TestModel
  

И я хотел бы проанализировать сам класс, чтобы иметь возможность формировать некоторую метаинформацию для интерфейса. Но я не могу получить доступ к xxx или имени, например:

 schema_instance = TestSchema()
schema_instance.xxx ???AttributeError: 'TestSchema' object has no attribute 'xxx'
  

Комментарии:

1. Вам нужен другой класс и сбросьте его, TestSchema и тогда он будет работать

Ответ №1:

Как комментирует @maruthi-adithya, вам нужно определить другой класс для сброса результата TestSchema; вам нужно будет использовать postload какие дескрипторы после десериализации, в которых вы можете возвращать данные по мере необходимости, проверьте документацию для этого здесь . Ниже приведен пример:

 class Test:
    def __init__(self, xxx, name, id):
        self.xxx = xxx
        self.name = name
        self.id = id
    def __repr__(self):
        return (
            f'<Test(xxx={self.id}, name={self.name})'
        )


class TestSchema(db_schema.SQLAlchemyAutoSchema):
    xxx = fields.Str()
    name = fields.Str(validate=validate.Length(min=1), required=True, error_messages={"required": "The name is required."})
    id = fields.Integer()
    class Meta:
        fields = ('id', 'name', 'description')
        model = TestModel

    @postload
    def return_as_object(self, data, **kwargs):
        return Test(**data)