2015-12-22 14 views
20

この問題に触れる質問と回答がいくつかありますが、これを達成しようとしているものと正確には一致させることはできません。SQLALchemyポリモーフィックモデルを使用した多対多リレーションシップコンフィグレーション

Hereherehere

私は自己参照と継承されているモデルのセットを持っています。これが基本設計です。

class BaseUser(db.Model): 
    id = db.Column(db.Integer, primary_key=True, nullable=False) 
    org = db.Column(db.Boolean, default=False, nullable=False) 
    # Shared Fields 
    __mapper_args__ = { 
     'polymorphic_on': org, 
    } 

class Customer(BaseUser): 
    # Customer Fields 
    __mapper_args__ = { 
     'polymorphic_identity': 0 
    } 

class Organization(BaseUser): 
    # Organization Fields 
    __mapper_args__ = { 
     'polymorphic_identity': 1 
    } 

class CustomerOrganization(db.Model): 
    user_id = db.Column(db.ForeignKey('customer.id', ondelete=CASCADE, onupdate=CASCADE), primary_key=True, nullable=False) 
    org_id = db.Column(db.ForeignKey('customer.id', ondelete=CASCADE, onupdate=CASCADE), primary_key=True, nullable=False) 

私は「ORGS」とこれらの各タイプの「メンバー」関係を作成するには、いくつかの異なる方法を試してみました。 relationsihp()の属性を定義する方法についてのアドバイスはありますか?

答えて

5

primaryjoinおよびsecondaryjoinプロパティを使用して行うことができます。関連するドキュメントはhereです。

例:

customer_organization = Table(
    'base_user_customer_organization', ModelBase.metadata, 
    Column('user_id', Integer, ForeignKey('base_user.id')), 
    Column('org_id', Integer, ForeignKey('base_user.id')) 
) 


class BaseUser(ModelBase): 
    __tablename__ = 'base_user' 

    id = Column(Integer, primary_key=True, nullable=False) 
    org = Column(Boolean, default=False, nullable=False) 
    # Shared Fields 
    __mapper_args__ = { 
     'polymorphic_on': org, 
    } 
    customers = relationship(
     "BaseUser", 
     backref=backref('organization', order_by=id), 
     secondary=customer_organization, 
     primaryjoin=id==customer_organization.c.org_id and org==True, 
     secondaryjoin=id==customer_organization.c.user_id and org==False 
    ) 


class CustomerUser(BaseUser): 
    # Customer Fields 
    __mapper_args__ = { 
     'polymorphic_identity': False 
    } 


class OrganizationUser(BaseUser): 
    # Organization Fields 
    __mapper_args__ = { 
     'polymorphic_identity': True 
    } 

とテスト:

sql = sqldb.get_session() 
customer1 = sqldb.system.CustomerUser() 
sql.add(customer1) 
customer2 = sqldb.system.CustomerUser() 
sql.add(customer2) 
organization = sqldb.system.OrganizationUser() 
organization.customers = [customer1, customer2] 
sql.add(organization) 
sql.commit() 
# function prints all table data 
print get_sql_table_data(sqldb.system.BaseUser) 
print organization.customers 
print customer1.organization 
print customer2.organization 

出力:

[{'org': False, 'id': 1}, {'org': False, 'id': 2}, {'org': True, 'id': 3}] 
[<CustomerUser(id=1, org=False)>, <CustomerUser(id=2, org=False)>] 
[<OrganizationUser(id=3, org=True)>] 
[<OrganizationUser(id=3, org=True)>] 
+0

1つの多型のテーブルには、多くの多の関係ここでは、2つのクラスを保持している以前のようにテーブルは私が標準だと思うback-refを使ってコレクションプロパティとして公開されています – jayprich

関連する問題