0

我将模型声明为:

class SAProduct(Base):

    sku = Column(PRODUCT_SKU_TYPE, primary_key=True)
    i_want_to_hide = Column(String(20), nullable=False)
    name = Column(Unicode(255), nullable=True)

    @property
    def my_property(self):
        return i_calculate_property_here(self)

和 Spyne 模型声明为:

db = create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=db)

class TableModel(ComplexModelBase):
    __metaclass__ = ComplexModelMeta
    __metadata__ = MetaData(bind=db)

class SProduct(TableModel):
    __table__ = SAProduct.__table__

如何使属性i_want_to_hide从 Spyne 模型中排除,并将属性my_property包含为 Spyne 模型属性?

PS 现在我使用猴子补丁 Spyne 来支持这种语法:

class SProduct(GComplexModel):
    __model__ = Product

    class Attributes:
        exclude_attrs = ('i_want_to_hide',)
        add_attrs = {'my_property': Boolean}

但我想摆脱它。

4

1 回答 1

1

这并不能直接回答您的问题,但请考虑以下代码:

from spyne import *

TableModel = TTableModel()

class SomeClass(TableModel):
    __tablename__ = 'some_table'

    id = Integer(pk=True)
    s = Unicode
    i = Integer(exc_table=True)

在这里,pk代表主键(primary_key如果您愿意,可以使用长格式)并且该i属性将被 SqlAlchemy 忽略。例如,它不会在表中创建,它不会被 SqlAlchemy 的元类检测,等等。

至于将在 Spyne 的 RPC 部分中隐藏但不会从 SqlAlchemy 中隐藏的属性,这是 2.12 中的一个新功能。

你可以说,例如:

i = Integer(exc_table=True, pa={JsonObject: dict(exc=true)})

其中pa代表协议属性。prot_attrs(如果您愿意,可以使用长格式)i继承 JsonObject 的每个协议都会忽略这里。

如果您也不希望它在 wsdl 上,则必须执行以下操作:

i = Integer(exc_table=True, exc_interface=True)

https://github.com/arskom/spyne/blob/fa4b1eef5815d3584287d1fef66b61846f82d2f8/spyne/interface/xml_schema/model.py#L197

与 SqlAlchemy 相比,Spyne 提供了更丰富的对象模型接口。尝试在不添加 Spyne 作为依赖项的情况下复制此功能意味着您必须在项目中复制 Spyne 中完成的所有工作。这是你的选择!

于 2014-11-27T13:15:48.777 回答