2015-12-22 8 views
20

के साथ कई मॉडल रिलेशनशिप कॉन्फ़िगरेशन के लिए कई, इस मुद्दे पर छूने वाले कुछ प्रश्न और उत्तर हैं, लेकिन मैं उन चीज़ों के साथ मेल नहीं कर सकता जो मैं प्राप्त करने की कोशिश कर रहा हूं।SQLALchemy पॉलिमॉर्फिक मॉडल

Here, here और here

मैं मॉडल कि स्वयं निर्देशात्मक और विरासत में मिला रहे हैं का एक सेट है। यह मूल डिजाइन है।

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 के रूप में पहले ही बहुरूपी तालिका यहां कई-कई संबंध दो वर्गों, रखती है टेबल को बैक-रेफ का उपयोग करके संग्रह संपत्ति के रूप में उजागर किया जाता है जो मुझे लगता है कि मानक है – jayprich