2015-12-22 22 views
20

Vì vậy, có một số câu hỏi và câu trả lời liên quan đến vấn đề này nhưng tôi không thể hòa giải chính xác với những gì tôi đang cố gắng đạt được.SQLALchemy Nhiều cấu hình quan hệ mô hình với mô hình đa hình

Here, herehere

Tôi có một tập hợp các mô hình đó là tự tham chiếu và kế thừa. Đây là thiết kế cơ bản.

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) 

Tôi đã thử một vài cách khác nhau để tạo mối quan hệ "tổ chức" và "thành viên" trên từng loại này. Bất kỳ lời khuyên nào về cách xác định thuộc tính relationsihp()?

Trả lời

5

Có thể thực hiện bằng cách sử dụng các thuộc tính primaryjoinsecondaryjoin. Tài liệu liên quan là here.

Ví dụ:

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 
    } 

Và kiểm tra:

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 

Output:

[{'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 như trước bảng đa hình đơn giữ hai lớp, ở đây quan hệ nhiều-nhiều bảng được hiển thị dưới dạng thuộc tính bộ sưu tập bằng cách sử dụng back-ref mà tôi nghĩ là tiêu chuẩn – jayprich

Các vấn đề liên quan