0

我正在尝试为 Db 模型编写一个装饰器,以使该模型可序列化

def Schema(cls):
    class Schema(marshmallow.ModelSchema):
        class Meta:
            model = cls

    cls.Schema = Schema
    return cls


@Schema
class SerialInterface(sql.Model, InheritanceModel):
    id = sql.Column(types.Integer, primary_key=True)
    transmission_rate = sql.Column(types.Integer)
    type = sql.Column(sql.String(50))

    mad_id = sql.Column(types.Integer, sql.ForeignKey('mad.id'))

    serial_protocol = sql.relationship(SerialProtocol, uselist=False, cascade="all, delete-orphan")

但我想在这个装饰器中传递嵌套对象,像这样:

@Schema(nested=['serial_protocol'])
class SerialInterface(sql.Model, InheritanceModel):
4

1 回答 1

2

您可以执行以下操作:

def Schema(*args, **kwargs):
    def wrapped(cls):
        class Schema(marshmallow.ModelSchema):
            class Meta:
                model = cls

        cls.Schema = Schema
        return cls
    return wrapped

然后做@Schema(nested=['serial_protocol'])会奏效。

它的工作原理是,您创建一个接受参数并返回装饰器的函数。从那里开始,装饰器就像普通的 Python 装饰器一样工作。

@Schema(nested=['serial_protocol'])
class SerialInterface:
    ...

装饰器翻译为:

SerialInterface = Schema(nested=['serial_protocol'])(SerialInterface)

额外提示,使用functools.wraps模块 :) 了解原因

于 2020-01-16T13:06:41.643 回答