2016-09-09 185 views
1

我在PostgreSQL中有一個包含有關文檔信息的表。比方說類似的東西:帶過濾器的SQLAlchemy映射表列

table: doc 

id (int) 
name (string) 
type (int) 

是爲一個文件的類別(如1 - 護照,2 - 保險等)。我也有不同的表格和每種類型的附加信息。

table: info 

id (int) 
doc_id (fk) 
info (additional columns) 

我想有一個SQLAlchemy的模型與它連接的文件每種類型作品的附加信息,並能夠管理列顯示(瓶,管理員,如果它是很重要的)。

現在加入兩個表成某種「示範」我以前Mapping Table Columns從這樣的SQLAlchemy的文檔(當只有一種類型的文件):

class DocMapping(db.Model): 

    __table__ = doc.__table__.join(info) 
    __mapper_args__ = { 
     'primary_key': [doc.__table__.c.id] 
    } 

現在的問題是:如何根據doc.type列創建從db.Model繼承的多個類(DocPassportMapping,DocInsuranceMapping等)?

類似的東西:

__table__ = doc.__table__.join(info).filter(doc.type) 

這顯然不工作,因爲我們沒有一個查詢對象這裏。

回答

3

如果我正確地理解了你,你希望有一個inheritance hierarchy基於DocMappingDocMapping.type作爲多態身份。既然你沒有提供一個完整的例子,這裏有一個相似的結構。它有一定的差異,但應適用於你的。這在已加入的映射上使用single table inheritance

的車型:

In [2]: class Doc(Base): 
    ...:  id = Column(Integer, primary_key=True, autoincrement=True) 
    ...:  name = Column(Unicode) 
    ...:  type = Column(Integer, nullable=False) 
    ...:  __tablename__ = 'doc' 
    ...:  

In [3]: class Info(Base): 
    ...:  __tablename__ = 'info' 
    ...:  doc_id = Column(Integer, ForeignKey('doc.id'), primary_key=True) 
    ...:  value = Column(Unicode) 
    ...:  doc = relationship('Doc', backref=backref('info', uselist=False)) 
    ...:  

In [4]: class DocMapping(Base): 
    ...:  __table__ = Doc.__table__.join(Info) 
    ...:  __mapper_args__ = { 
    ...:   'primary_key': (Doc.id,), 
    ...:   # These declare this mapping polymorphic 
    ...:   'polymorphic_on': Doc.type, 
    ...:   'polymorphic_identity': 0, 
    ...:  } 
    ...:  

In [5]: class Passport(DocMapping): 
    ...:  __mapper_args__ = { 
    ...:   'polymorphic_identity': 1, 
    ...:  } 
    ...:  

In [6]: class Insurance(DocMapping): 
    ...:  __mapper_args__ = { 
    ...:   'polymorphic_identity': 2, 
    ...:  } 
    ...:  

測試:

In [7]: session.add(Insurance(name='Huono vakuutus', 
    ...:      value='0-vakuutus, mitään ei kata')) 

In [8]: session.commit() 

In [15]: session.query(DocMapping).all() 
Out[15]: [<__main__.Insurance at 0x7fdc0a086400>] 

In [16]: _[0].name, _[0].value 
Out[16]: ('Huono vakuutus', '0-vakuutus, mitään ei kata') 

的事情是:你可能不希望從DocMapping繼承多個類,從db.Model爲基地繼承,但類。它作爲一個層次結構更有意義。

+0

正是我在找的!太好了謝謝。 – Max