Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLALchemy多态模型的多对多模型关系配置_Python_Sqlalchemy - Fatal编程技术网

Python SQLALchemy多态模型的多对多模型关系配置

Python SQLALchemy多态模型的多对多模型关系配置,python,sqlalchemy,Python,Sqlalchemy,因此,有一些问题和答案涉及到这个问题,但我无法使它们与我试图实现的目标完全一致 ,及 我有一组模型是自引用的和继承的。这是基本设计 类BaseUser(db.Model): id=db.Column(db.Integer,primary_key=True,nullable=False) org=db.Column(db.Boolean,default=False,nullable=False) #共享字段 __映射器参数={ “多态性”:组织, } 类别客户(基本用户): #客户字段 __映射器

因此,有一些问题和答案涉及到这个问题,但我无法使它们与我试图实现的目标完全一致

,及

我有一组模型是自引用的和继承的。这是基本设计

类BaseUser(db.Model):
id=db.Column(db.Integer,primary_key=True,nullable=False)
org=db.Column(db.Boolean,default=False,nullable=False)
#共享字段
__映射器参数={
“多态性”:组织,
}
类别客户(基本用户):
#客户字段
__映射器参数={
“多态_标识”:0
}
类组织(基本用户):
#组织域
__映射器参数={
“多态_标识”:1
}
类CustomerOrganization(数据库模型):
user\u id=db.Column(db.ForeignKey('customer.id',ondelete=CASCADE,onupdate=CASCADE),primary\u key=True,nullable=False)
org\u id=db.Column(db.ForeignKey('customer.id',ondelete=CASCADE,onupdate=CASCADE),primary\u 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}]
[<CustomerUser(id=1, org=False)>, <CustomerUser(id=2, org=False)>]
[<OrganizationUser(id=3, org=True)>]
[<OrganizationUser(id=3, org=True)>]
[{'org':False,'id':1},{'org':False,'id':2},{'org':True,'id':3}]
[, ]
[]
[]

+1与前面的单个多态表包含两个类一样,这里的多个关系表使用back ref作为集合属性公开,我认为这是标准的