SQLAlchemy 在一个关系中组合多个 Child 类
SQLAlchemy Combine Multiple Child Classes in one Relationship
我想知道是否有人可以帮助我解决我在一个关系中组合多个 child 类 的 SQLAlchemy 问题。
我正在开发一个项目管理应用程序,其中的任务分解结构如下:
摘要任务 -> 任务 -> 子任务 -> 定位任务
摘要任务能够引用另一个形成层次结构的摘要任务。同时,任务不一定属于摘要任务。
我目前的解决方案是在不同的关系中引用它们:
class SummaryTask(Base):
__tablename__ = 'summary_task'
id = Column(Integer, primary_key=True)
schedule_id = Column(ForeignKey('schedule.id'), primary_key=True)
parent_id = Column(Integer)
parent_schedule_id = Column(Integer)
additional_data = Column(Unicode(50))
children = relationship('SummaryTask', backref=backref('parent', remote_side=[id, schedule_id]))
tasks = relationship('Task', backref=backref('parent'))
class Task(Base):
__tablename__ = 'task'
__table_args__ = (ForeignKeyConstraint(['summary_task_id', 'schedule_id'], ['summary_task.id', 'summary_task.schedule_id']))
id = Column(Integer, primary_key=True)
schedule_id = Column(ForeignKey('schedule.id'), primary_key=True)
summary_task_id = Column(Integer)
summary_task = relationship('SumTask')
上面的代码片段对我有用,但我想结合摘要任务 (children) 和 children 中的任务,因为两者确实是 children 的总结任务。
class SummaryTask(Base):
...
children = relationship('SummaryTask', 'Task' ...)
我的界面将如下来自 Pydantic:
class SummaryTaskInterface(BaseModel):
id: int
schedule_id: int
parent_id: Optional[int] = None
parent_schedule_id: Optional[int] = None
additional_data: str
children: List[Union['SummaryTaskInterface', 'TaskInterface']] = []
我希望有人能帮助我。
亲切的问候
我最终得到了这个解决方案。
class SummaryTask(Base):
__tablename__ = 'summary_task'
id = Column(Integer, primary_key=True)
schedule_id = Column(ForeignKey('schedule.id'), primary_key=True)
parent_id = Column(Integer)
parent_schedule_id = Column(Integer)
additional_data = Column(Unicode(50))
summary_tasks = relationship('SummaryTask', backref=backref('parent', remote_side=[id, schedule_id]))
tasks = relationship('Task', backref=backref('parent'))
@hybrid_property
def children(self):
return self.summary_tasks + self.tasks
使用已经建议的界面。
class SummaryTaskInterface(BaseModel):
id: int
schedule_id: int
parent_id: Optional[int] = None
parent_schedule_id: Optional[int] = None
additional_data: str
children: List[Union['SummaryTaskInterface', 'TaskInterface']] = []
我想知道是否有人可以帮助我解决我在一个关系中组合多个 child 类 的 SQLAlchemy 问题。
我正在开发一个项目管理应用程序,其中的任务分解结构如下:
摘要任务 -> 任务 -> 子任务 -> 定位任务
摘要任务能够引用另一个形成层次结构的摘要任务。同时,任务不一定属于摘要任务。
我目前的解决方案是在不同的关系中引用它们:
class SummaryTask(Base):
__tablename__ = 'summary_task'
id = Column(Integer, primary_key=True)
schedule_id = Column(ForeignKey('schedule.id'), primary_key=True)
parent_id = Column(Integer)
parent_schedule_id = Column(Integer)
additional_data = Column(Unicode(50))
children = relationship('SummaryTask', backref=backref('parent', remote_side=[id, schedule_id]))
tasks = relationship('Task', backref=backref('parent'))
class Task(Base):
__tablename__ = 'task'
__table_args__ = (ForeignKeyConstraint(['summary_task_id', 'schedule_id'], ['summary_task.id', 'summary_task.schedule_id']))
id = Column(Integer, primary_key=True)
schedule_id = Column(ForeignKey('schedule.id'), primary_key=True)
summary_task_id = Column(Integer)
summary_task = relationship('SumTask')
上面的代码片段对我有用,但我想结合摘要任务 (children) 和 children 中的任务,因为两者确实是 children 的总结任务。
class SummaryTask(Base):
...
children = relationship('SummaryTask', 'Task' ...)
我的界面将如下来自 Pydantic:
class SummaryTaskInterface(BaseModel):
id: int
schedule_id: int
parent_id: Optional[int] = None
parent_schedule_id: Optional[int] = None
additional_data: str
children: List[Union['SummaryTaskInterface', 'TaskInterface']] = []
我希望有人能帮助我。
亲切的问候
我最终得到了这个解决方案。
class SummaryTask(Base):
__tablename__ = 'summary_task'
id = Column(Integer, primary_key=True)
schedule_id = Column(ForeignKey('schedule.id'), primary_key=True)
parent_id = Column(Integer)
parent_schedule_id = Column(Integer)
additional_data = Column(Unicode(50))
summary_tasks = relationship('SummaryTask', backref=backref('parent', remote_side=[id, schedule_id]))
tasks = relationship('Task', backref=backref('parent'))
@hybrid_property
def children(self):
return self.summary_tasks + self.tasks
使用已经建议的界面。
class SummaryTaskInterface(BaseModel):
id: int
schedule_id: int
parent_id: Optional[int] = None
parent_schedule_id: Optional[int] = None
additional_data: str
children: List[Union['SummaryTaskInterface', 'TaskInterface']] = []