两个 SQLalchemy 关系,一个不产生任何结果,另一个产生空列表:为什么?

问题描述 投票:0回答:1

我设置了以下类来使用 sqlalchemy 定义表:

项目

class Project(Base):

    __tablename__ = "projects"

    id: Mapped[int] = mapped_column(primary_key=True, nullable=True)
    title: Mapped[str] = mapped_column()
    outputs: Mapped[list[ResearchOutput]] = relationship(
        secondary=proj_output_association_tbl, back_populates="projects", uselist=True
    )
    users: Mapped[list[User]] = relationship(
        secondary=project_association_tbl, back_populates="projects"
    )


    def __init__(
        self,
        pure_id: int,
        title: str,
    ) -> None:

        self.id = id
        self.title = title

输出

class Output(Base):

    __tablename__ = "outputs"

    id: Mapped[int] = mapped_column(primary_key=True, nullable=True)
    users: Mapped[list[User]] = relationship(
        secondary=output_association_tbl, back_populates="outputs"
    )
    title: Mapped[str] = mapped_column()
    projects: Mapped[Optional[Project]] = relationship(
        secondary=proj_output_association_tbl,
        back_populates="outputs",
    )
    equipment: Mapped[Optional[Equipment]] = relationship(
        secondary=equipment_association_tbl,
        back_populates="outputs",
    )

    def __init__(
        self,
        id: int,
        title: str,
    ) -> None:

        self.pure_id = pure_id
        self.title = title

设备 类设备(基础):

    __tablename__ = "equipment"

    id: Mapped[str] = mapped_column(primary_key=True, nullable=True)
    outputs: Mapped[list[ResearchOutput]] = relationship(
        secondary=equipment_association_tbl, back_populates="equipment"
    )
    name: Mapped[str] = mapped_column()

    def __init__(
        self,
        id: int,
        name: str,
    ) -> None:

        self.name = name
        self.id = id

我可以初始化

Output
的实例,并通过初始化它们并附加到
equipment
来将
output.equipment
添加到其中,因为
output.equipment
被初始化为空列表
[]

但是,当我尝试采用完全相同的方法来设置输出项目时,我无法做到这一点,因为

output.projects
被初始化为
None

谁能解释一下为什么会这样?

谢谢!

python sqlalchemy orm
1个回答
0
投票

我猜这与类型提示有关

class Output(Base):
    ...

    projects: Mapped[Optional[Project]] = relationship(
        secondary=proj_output_association_tbl,
        back_populates="outputs",
    )

尝试更改为

Mapped[List[Project]] = ...

© www.soinside.com 2019 - 2024. All rights reserved.