如何使用exclude_properties和include_properties从相应的Spyne模型中排除/包含SQLAlchemy模型属性?

时间:2014-11-25 14:04:09

标签: python sqlalchemy spyne

我将模型声明为:

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模型属性包含在内?

P.S。 现在我使用猴子修补Spyne来支持这种语法:

class SProduct(GComplexModel):
    __model__ = Product

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

但我想摆脱它。

1 个答案:

答案 0 :(得分: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),SqlAlchemy只会忽略i属性。例如它不会在表格中创建,它不会被SqlAlchemy的元类等装备。

对于将从Spyne的RPC部件隐藏的属性,而不是来自SqlAlchemy的属性,这是2.12中的新功能。

你可以说例如:

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

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

如果您不想在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中完成的所有工作。这是你的选择!