Flask / Sqlaclemy:如何进行一对多的多态继承

时间:2017-08-14 18:46:27

标签: python flask sqlalchemy flask-sqlalchemy

我试图在flask / sqlalchemy中创建一对多的多态关系。该概念是使用授权表为某些数据提供临时性。该表将有两个字段,authorizable_id和authorizable_type。 authorizable_id引用它所引用的条目的id。它不是外键,因为它可以引用不同的表。 authorizable_type确定它引用的表。例如,对于文件,它是'FILE'。

我已经看过如何做类似的事情,但sqlalchemy文档对字段的作用非常隐含。另外,它们要求被引用的表(这里是File)具有id,该id是引用保存关系的表的外键(discriminator / id)。我正在做相反的事情,其中​​多态关系持有资产的id。我希望sqlalchemy有一个像“polymorphic_field”这样的值,你可以在其中指出哪个字段名称。我已添加以下代码。任何指导都非常感谢。谢谢!

class AuthorizableInterface(Model):
    __mapper_args__ = {
        'polymorphic_identity':'AUTHORIZABLE',
    }

class Authorization(Model):
    __tablename__ = 'authorizations'
    token = Column(String(254), nullable=False)
    ...
    authorizable_id = Column(Integer(), ForeignKey(AuthorizableInterface.id))
    authorizable_type = Column(String(254), nullable=False)
    __mapper_args__ = {
        'polymorphic_on': authorizable_type,
        'polymorphic_field' 'authorizable_id' // not a real thing, what i want to do
    }


class File(AuthorizableInterface):
    __tablename__ = 'files'
    url = Column(Text(1024), nullable=False)
    provider_id = Column(Integer(), ForeignKey('file_providers.id'))
    __mapper_args__ = {
        'polymorphic_identity':'FILE'
    }

class AnotherAuthorizableThing(AuthorizableInterface): 
    ...
    __mapper_args__ = {
        'polymorphic_identity':'THING'
    }

0 个答案:

没有答案