使用关系时,SQLAlchemy不会自动填充外键字段

2024-04-27 05:14:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的一对多关系。我有ProjectDevice类。一个Project可以有多个Device

当我使用关系将设备添加到项目中时,程序的行为与我预期的不同。你知道吗

完整的程序如下:

from sqlalchemy import Column, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()


class Project(Base):
    __tablename__ = "Projects"

    name = Column('Name', String(50), primary_key=True)
    devices = relationship("Device", back_populates="project")


class Device(Base):
    __tablename__ = "Devices"

    serial_no = Column('SerialNo', String(50), primary_key=True)
    project_name = Column('ProjectName', String(50), ForeignKey("Projects.Name"))
    project = relationship("Project", back_populates="devices", foreign_keys=[project_name])


if __name__ == "__main__":
    p = Project(name="MyProject")
    d = Device()

    print("Before adding device:")
    print(f"p.devices: {p.devices}")
    print(f"d.project: {d.project}")
    print(f"d.project_name: {d.project_name}")

    p.devices.append(d)

    print("After adding device:")
    print(f"p.devices: {p.devices}")
    print(f"d.project: {d.project}")
    print(f"d.project_name: {d.project_name}")

下面是输出:

Before adding device:
p.devices: []
d.project: None
d.project_name: None
After adding device:
p.devices: [<__main__.Device object at 0x000001FF049B22B0>]
d.project: <__main__.Project object at 0x000001FF03DB0D30>
d.project_name: None

除最后一个d.project_name外,所有输出都与预期一致。d.project_name仍然返回None。我希望它也被填充为MyProject,因为d.project返回那个项目对象。你知道吗

我错过了什么?你知道吗


Tags: namefromimportprojectnonestringsqlalchemydevice