SQL Alchemy / Multi Class Realationship

时间:2016-02-17 16:57:36

标签: python sqlalchemy

我有问题。看下面,我需要属性' pricing_item'成为3个不同的班级之一。但是对于sqlalchemy,我只知道如何与另一个班级建立关系。如何在不使用继承的情况下与多个类建立关系?实现这一目标的最佳方法是什么?

最后,我想了解sqlalchemy中创建包含多个类的列表的最佳方法,这些内容在python中是微不足道的,但是表格很难实现这一功能。

感谢。

class QuoteItem(Base, DataObject):
    __tablename__ = 'quote_item'

    uuid = Column(String, primary_key=True)
    quote_id = Column(String, ForeignKey('quote.uuid'))
    quote_template = relationship('Quote')
    position = Column(Integer)
    quantity = Column(Integer)
    priced_item = relationship( ***** HERE IS MY ISSUE *****)

    discriminator = Column('type', String)
    __mapper_args__ = {
        'polymorphic_identity': 'quote_item',
        'polymorphic_on': discriminator
    }

    def __init__(self, quote, quantity, priced_item):
        """

        :type quote: Quote
        :type quantity: int
        :type priced_item: AbstractPart | AbstractLabor | AbstractService
        """

        DataObject.__init__(self)

        self.quote = quote
        self.quantity = quantity

        self.price_item = priced_item

1 个答案:

答案 0 :(得分:0)

我认为这里的问题不是sqlalchemy,而是实际上是数据库结构。

首先想象一下,你只使用SQL。这些数据如何在数据库中表示?

"引用项目"之间的关系和"定价项"是一对多,对吧?一个"引用的项目"有许多"定价商品"。

为了能够在数据库中链接它们,您必须为"定价项目#34;创建一些公共表格,例如:

quoted_item_id

每个项目都有一个priced_type_one --------------- item_id specific_data1 specific_data2 1 one two priced_type_two --------------- item_id specific_dataX specific_dataY 2 55 66 ,因此每个引用的项目都与许多定价项目有关系。

然后,您可以为不同类型的定价商品添加其他表格(item_id可以是主键):

SoapObject.setInnerText("...");

等等。

上面是多表继承,你也可以使用单表继承(所有价格项目都有一个大表),我认为其他一些变种也是可能的。

一旦您决定如何在数据库级别执行此操作,您可以转到sqlalchemy并支持此类模式,请查看文档中的Mapping Class Inheritance Hierarchies