2016-09-09 6 views
1

私は、ドキュメントに関する情報を含むPostgreSQLのテーブルを持っています。 ( - パスポート、2 - 保険など例えば1)フィルタ付きSQLAlchemyマッピングテーブルの列

table: doc 

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

タイプ文書のカテゴリである:そのような何かを言うことができます。また、私は別のテーブルを持っているすべてのドキュメントタイプの追加情報があります。

table: info 

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

は、私はそれにリンクされたドキュメントの各タイプで動作するようにSQLAlchemyのモデルさんのその他の情報を持っているし、(それが重要な場合はフラスコ-管理のために)表示する列を管理できるようにしたいです。今、「モデル」(文書の一種類のみがあったとき)、私はそのようなSQLAlchemyのドキュメントからMapping Table Columnsを使用するいくつかの並べ替えに2つのテーブルを結合するため

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

私が正しく理解していれば、をDocMappingに、DocMapping.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') 

事はある:あなたはおそらく、複数の拠点としてdb.Modelから継承するクラスが、DocMappingから継承するクラスを望んでいません。それは階層としてもっと意味があります。

+0

正確に何をお探しですか?よかった。ありがとう。 – Max

関連する問題