因此,有一些问题和答案涉及到这个问题,但我无法将它们与我想要达到的目标完全一致.
在这里,这里和这里
我有一组自我指涉和继承的模型.这是基本设计.
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)
我尝试了几种不同的方法来为这些类型中的每一种创建"组织"和"成员"关系.有关如何定义relationsihp()
属性的任何建议?
它可以使用primaryjoin
和secondaryjoin
属性完成.相关文档在这里.
例:
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}] [, ] [ ] [ ]