【问题标题】:SQLAlchemy Combine Multiple Child Classes in one RelationshipSQLAlchemy 在一个关系中组合多个子类
【发布时间】:2021-02-05 06:00:50
【问题描述】:

我想知道是否有人可以帮助我解决在一个关系中组合多个子类的 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')

上面的代码 sn-p 对我有用,但我想将摘要任务(子级)和子级任务结合起来,因为它们确实是摘要任务的子级。

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']] = []

我希望有人可以在这里帮助我。

亲切的问候

【问题讨论】:

  • 什么是型号?你是说BaseModel吗?
  • 是的,当然 - 我做出了改变。

标签: python sqlalchemy fastapi pydantic


【解决方案1】:

我最终得到了这个解决方案。

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']] = []

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 2020-12-30
    • 2012-05-13
    • 2012-06-14
    • 2014-05-19
    • 2012-02-08
    • 2021-06-26
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多