<p>由于您要寻找的解决方案不需要将外键移动到其他表,因此可以尝试以下方法:</p>
<pre><code>import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import sql
Base = declarative_base()
engine = sqlalchemy.create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
session = Session()
class Info(Base):
__tablename__ = 'info'
id = Column(Integer(), primary_key=True)
type = Column(String())
item_id = Column(Integer())
@property
def item(self):
if self.type == 'car':
return self._car
elif self.type == 'suv':
return self._suv
return None
@item.setter
def item(self, value):
if value is not None:
self.item_id = value.id
self.type = value.__tablename__
else:
self.item_id = None
class Car(Base):
__tablename__ = 'car'
id = Column(Integer(), primary_key=True)
info = relationship(Info, primaryjoin=sql.and_(id == Info.item_id, Info.type == 'car'), foreign_keys=Info.item_id, uselist=False, backref='_car')
class Suv(Base):
__tablename__ = 'suv'
id = Column(Integer(), primary_key=True)
info = relationship(Info, primaryjoin=sql.and_(id == Info.item_id, Info.type == 'suv'), foreign_keys=Info.item_id, uselist=False, backref='_suv')
</code></pre>
<p>我改名了信息车即使类型为“suv”,汽车也不可避免地成为一个伪造的汽车对象。在</p>
<p>为了简单起见,我省略了事件侦听器的内容,但是您可以根据我的另一个答案调整您需要的部分,以避免事情陷入不一致的状态。在</p>