我正在尝试使用一个外部库,它在我自己的程序中定义了一个类模型。我希望我定义的类在所有方面都与库中的父类相同,除了我想在本地扩展中附加一些辅助方法。例如:
外部图书馆:
Base = declarative_base()
class BaseUser(Base):
__tablename__ = 'user'
email = Column(String(100), nullable=False, unique=True)
password = Column(String(128), nullable=False)
address_uid = Column(Integer, ForeignKey('address.uid'))
address = relationship('BaseAddress', back_populates="users")
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.address = BaseAddress()
class BaseAddress(Base):
__tablename__ = 'address'
street = Column(String(100))
unit = Column(String(32))
city = Column(String(64))
state = Column(String(32))
postal = Column(String(32))
country = Column(String(32))
users = relationship('user', back_populates="address")
本地模式:
class User(BaseUser):
def in_country(county):
return self.address.country == country
class Address(BaseAddress):
pass
这里的目标是创建sqlalchemy无法与父母区别开来的子类。例如,如果我将Address
插入User.address
,则sqlalchemy不应该抱怨类型不匹配(Address
而不是预期的BaseAddress
)。
我能辨别的唯一方法是在父类中使用polymorphic_on
。我不想这样做,因为它没有准确地模拟正在发生的事情。它需要一个鉴别器,如果我在本地使用迁移脚本,它可能会表现得很奇怪。 sqlalchemy是否有办法实现多态性(我认为它被称为" ad-hoc多态性")没有使用鉴别器,或其他一些方法来实现我的目标?
更新
我相信我可以通过在关系上使用enable_typechecks=False
来获得部分路径。但是,这并不能完全满足我的需求。我希望能够执行User.query()
之类的操作并取回User
而不是BaseUser
。