python - SQLAlchemy ORM - 3-一些对象关系
问题描述
我将 SQLAlchemy 与 Postgres 一起使用。来自https://auth0.com/blog/sqlalchemy-orm-tutorial-for-python-developers/
的代码示例
我有 3 个对象:
- 演员
- 特技演员
- 联系方式
在原始代码示例中,关系如下:
- 演员:ContactDetails = 1:0..*
- 演员:特技演员 = 1:1
见代码:
class Actor(Base):
__tablename__ = 'actors'
id = Column(Integer, primary_key=True)
name = Column(String)
birthday = Column(Date)
class Stuntman(Base):
__tablename__ = 'stuntmen'
id = Column(Integer, primary_key=True)
name = Column(String)
active = Column(Boolean)
actor_id = Column(Integer, ForeignKey('actors.id'))
actor = relationship("Actor", backref=backref("stuntman", uselist=False))
class ContactDetails(Base):
__tablename__ = 'contact_details'
id = Column(Integer, primary_key=True)
phone_number = Column(String)
address = Column(String)
actor_id = Column(Integer, ForeignKey('actors.id'))
actor = relationship("Actor")
我正在努力将此模型扩展到以下关系:
- 演员:ContactDetails = 1:0..*
- 演员:特技演员 = 1:1
- 特技演员:联系方式 = 1:0..*
特技演员也很努力,应该得到联系方式。请问谁能帮忙?!
解决方案
在我看来,实现所需的最佳方法是使用关联表。这个应该工作:
actors_to_contact_details = Table('actors_to_contact_details', Base.metadata,
Column('actor_id', Integer, ForeignKey('actors.id')),
Column('contact_detail_id', Integer, ForeignKey('contact_details.id'))
)
stuntmen_to_contact_details = Table('stuntmen_to_contact_details', Base.metadata,
Column('stuntman_id', Integer, ForeignKey('stuntmen.id')),
Column('contact_detail_id', Integer, ForeignKey('contact_details.id'))
)
class Actor(Base):
__tablename__ = 'actors'
id = Column(Integer, primary_key=True)
name = Column(String)
birthday = Column(Date)
contact_details = relationship("ContactDetails", secondary=actors_to_contact_details)
class Stuntman(Base):
__tablename__ = 'stuntmen'
id = Column(Integer, primary_key=True)
name = Column(String)
active = Column(Boolean)
actor_id = Column(Integer, ForeignKey('actors.id'))
actor = relationship("Actor", backref=backref("stuntman", uselist=False))
contact_details = relationship("ContactDetails", backref="stuntman", secondary=stuntmen_to_contact_details)
class ContactDetails(Base):
__tablename__ = 'contact_details'
id = Column(Integer, primary_key=True)
phone_number = Column(String)
address = Column(String)
如果你愿意,你可以unique=True
像这样放入关联表
actors_to_contact_details = Table('actors_to_contact_details', Base.metadata,
Column('actor_id', Integer, ForeignKey('actors.id')),
Column('contact_detail_id', Integer, ForeignKey('contact_details.id'), unique=True)
)
stuntmen_to_contact_details = Table('stuntmen_to_contact_details', Base.metadata,
Column('stuntman_id', Integer, ForeignKey('stuntmen.id')),
Column('contact_detail_id', Integer, ForeignKey('contact_details.id'), unique=True)
)
其他选择是将另一个可为空的外键放在Stuntman
表上,但我会采用上面介绍的解决方案。
推荐阅读
- authentication - 将 OIDC 密码授予与 MFA 结合使用
- python - 有没有办法导出许多大小和位置完全相同的饼图/甜甜圈图?(matplotlib)
- assembly - 无源代码使用gdb反汇编程序(二进制炸弹phase_4)
- java - PaintComponent 似乎没有接到电话或显示
- python - 用数字序列填充 numpy 数组
- c - C语言中剪刀石头布程序的问题
- azure - 使用 PersistentVolumes 的 Azure Kubernetes 故障转移
- google-maps - Flutter GoogleMap Provider Context问题
- mongodb - 将 Apollo 与 mongodb 连接起来
- c++ - 何时出队大小调用不是线程安全的?