шаблон sqlalchemy polymorphi c создает дублированные столбцы - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь создать модель данных, содержащую события и детали события. Я хотел бы, чтобы детали события были найдены в коллекции внутри объекта события. Для этого sh я хотел бы создать абстрактную сущность события, которая наследуется конкретными деталями события. Затем мы можем сказать, что коллекция содержит подробности о событиях, даже если подклассы разные.

Я использовал установленный здесь шаблон полиморфизма https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/api.html#sqlalchemy .ext.declarative.AbstractConcreteBase

Это работает достаточно хорошо, но делает то, чего я не ожидал. Все дочерние элементы родительского класса содержат все столбцы всех дочерних элементов! Когда я создаю больше подклассов, это быстро превращается в объект с невероятно запутанным количеством полей.

Вот минимальная версия моего кода:

base = declarative_base()
class Event(base):
    __tablename__ = 'Event'
    uid = Column(Integer, primary_key=True)

Event.details = relationship('EventDetail',
                             primaryjoin='EventDetail.event_id == Event.uid')

class EventDetail(base, AbstractConcreteBase):

    uid = Column(Integer, primary_key=True)

    @declared_attr
    def event_id(cls):
        return Column(Integer, ForeignKey(Event.uid))

    @declared_attr
    def event(cls):
        return relationship(Event)

class SchedulingDetail(EventDetail):
    __tablename__ = 'SchedulingDetail'

    starts_at = Column(DateTime)

    __mapper_args__ = {
        "polymorphic_identity": __tablename__,
        "concrete": True
    }

class LocationDetail(EventDetail):
    __tablename__ = 'LocationDetail'

    address_id = Column(Integer, ForeignKey('Address.uid'))

    address = relationship('Address')

    __mapper_args__ = {
        "polymorphic_identity": __tablename__,
        "concrete": True
    }

Вы найдете в приведенном выше у LocationDetail есть дата начала, а у SchedulingDetail есть адрес! У кого-нибудь есть какой-нибудь совет, как можно избежать того, чтобы у всех детей были одинаковые поля?

...