Общая ассоциация SQLAlchemy с дополнительными данными - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь установить общую ассоциацию, подобную этому примеру:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...