我想做些傻事,但让我们试试。
我正在使用sqlalchemy并定义以下两个表:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
name = Column(String)
children = relationship("Child", cascade='all, delete-orphan')
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id', ondelete='CASCADE'))
到目前为止还不错,我的父母可以有多个孩子,当父母被删除的孩子方便地做同样的事情。
现在我想照顾孤儿。他们没有父母,但住在孤儿院。我先建孤儿院:
class Orphanage(Base):
__tablename__ = 'orphanage'
id = Column(Integer, primary_key=True)
name = Column(String)
children = relationship("Child", cascade='all, delete-orphan')
但是现在我需要能够把孩子连接到孤儿院而不是父母。我想将子对象中的外键替换为如下内容:
custodian_id = Column(Integer, ForeignKey('parent.id' or 'orphanage.id', ondelete='CASCADE'))
有没有一个关系模型可以支持这一点?
谢谢您!
1条答案
按热度按时间x9ybnkn61#
基本上,您创建了一个“虚拟”父对象,但它并不位于父对象和子对象之间。您为孤儿院创建了一个表,但它将成为父级的另一个子表(或者可以反转)。解释比表现更难。我来演示一下(免责声明:我不知道sqlalchemy,所以格式可能非常正确,但您应该了解这个想法)。
首先,创建一个孤儿院表假设有额外的属性,并且您已经简化了这个问题。如果不是这样的话,那么仅仅向父级添加一个布尔值就足够了。
这将确定孤儿和孤儿院,而不作额外的改动。但是,假设孤儿院有足够的其他处理方法,以下是一种方法:
一个例子可能是为了,但我将不得不这样做,从数据库方面。看这里的小提琴。
这只是几种可能性中的一种。总体思路是保留处理父-子处理的能力,不管子对象是否为孤儿,同时添加在需要时单独处理的能力。这样做只需对数据结构进行最小的更改。
我想我不提表继承是失职的。所以请跟随链接。也许孤儿院可以从父代继承(至少使用当前属性)。但我倾向于避免它,因为我不喜欢postgres的实现。但是,它可能与您的orm一起工作。希望这有帮助。