sqlalchemy多态性没有鉴别器

时间:2017-03-21 03:54:37

标签: python sqlalchemy polymorphism subtype

我正在尝试使用一个外部库,它在我自己的程序中定义了一个类模型。我希望我定义的类在所有方面都与库中的父类相同,除了我想在本地扩展中附加一些辅助方法。例如:

外部图书馆:

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

0 个答案:

没有答案