Фильтрация таблицы ассоциации во вторичном объекте для включения только строк интересующего вас типа для каждого отношения, кажется, работает:
class Parent(Base):
__tablename__ = 'left'
id = Column(Integer, primary_key=True)
children = relationship("Association", back_populates="parent")
# I would also like to define 'sons' and 'daughters' here
sons = relationship(
'Child',
secondary="join(Association, ChildType, "
"and_(Association.child_type_id==ChildType.id, "
"ChildType.name=='son'))",
viewonly=True
)
daughters = relationship(
'Child',
secondary="join(Association, ChildType, "
"and_(Association.child_type_id==ChildType.id, "
"ChildType.name=='daughter'))",
viewonly=True
)
... но добавление объектов через эти отношения не будетработают, поскольку они не знают, как создать объект ассоциации с child_type, следовательно, viewonly
.Кроме того, я изменил Association.child_type
на child_type_id = Column(Integer, ForeignKey('child_type.id'))
, поэтому в этом примере все по-другому.
Элемент Child
/ ChildType
выделяется как возможное применение наследования 'класса отображения.Шаблон иерархии, если вы не привязаны к этой схеме, это может быть что-то для изучения.