Я пытаюсь установить общую ассоциацию, подобную этому примеру:
https://docs.sqlalchemy.org/en/13/_modules/examples/generic_associations/table_per_association.html
Я хочу добавить дополнительные данные в ассоциацию, а также чтобы дети были полиморфными
Это настройка, которую я пытаюсь выполнить:
У меня есть два разных приложения, которые отображают данные в таблице.Пользователи могут настроить, какие столбцы они видят в обеих таблицах.Каждый пользователь связан с сайтом.Если они не настроены, столбцы таблицы, которые они видят, будут иметь настройки по умолчанию для своего сайта.Упорядочение столбцов следует выполнять внутри ассоциации, чтобы ее можно было настраивать в зависимости от пользователя / сайта.
Мне удалось установить полиморфную идентичность для двух различных типов столбцов, а также общий типm2m отношения между пользователями, сайтами и столбцами.
Проблема в том, что я не могу получить атрибут "порядковый номер" из каждого отношения.Моя цель - сделать что-то вроде этого:
user = session.query(User).first()
user.cols[0].ordinal = 1
site = session.query(Site).first()
site.cols[0].ordinal = 1
Я знаю, что для этого я должен сбросить таблицу ассоциации для объекта ассоциации, но я не могу понять, как это легко сделать.сохраняя при этом родовую связь.
Base = declarative_base()
class Col(Base):
__tablename__ = 'cols'
id = Column(Integer, primary_key=True)
label = Column(String(30))
type = Column(String(20))
__mapper_args__ = {
'polymorphic_identity':'cols',
'polymorphic_on':type,
'with_polymorphic': '*'
}
class OrderCol(Col):
__tablename__ = 'order_cols'
id = Column(Integer, ForeignKey('cols.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity':'order',
'polymorphic_load': 'inline'
}
class ItemCol(Col):
__tablename__ = 'item_cols'
id = Column(Integer, ForeignKey('cols.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity':'item',
'polymorphic_load': 'inline'
}
class HasCols:
@declared_attr
def col_association(cls):
return Table(
f"{cls.__tablename__}_cols",
cls.metadata,
Column("col_id", ForeignKey("cols.id"), primary_key=True),
Column(f"{cls.__tablename__}_id", ForeignKey(f"{cls.__tablename__}.id"), primary_key=True),
Column('ordinal', Integer) # I need to be able to access this property
)
@declared_attr
def cols(cls):
return relationship(Col, secondary=cls.col_association)
@declared_attr
def order_cols(cls):
return relationship(OrderCol, secondary=cls.col_association)
@declared_attr
def item_cols(cls):
return relationship(ItemCol, secondary=cls.col_association)
class Site(HasCols, Base):
__tablename__ = 'sites'
id = Column(Integer, primary_key=True)
name = Column(String(100))
class User(HasCols, Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(100))