Я пытаюсь создать модель данных, содержащую события и детали события. Я хотел бы, чтобы детали события были найдены в коллекции внутри объекта события. Для этого 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
есть адрес! У кого-нибудь есть какой-нибудь совет, как можно избежать того, чтобы у всех детей были одинаковые поля?