【问题标题】:SQLAlchemy adjacency list relationship with declared attributesSQLAlchemy 邻接列表与声明属性的关系
【发布时间】:2016-07-11 05:56:59
【问题描述】:

我有一个由不同类型的孩子继承的顶级模型声明

class HasId(object):

    @declared_attr
    def id(cls):
        return Column('id', Integer, Sequence('test_id_seq'), primary_key=True)
    ...
    @declared_attr
        def triggered_by_id(cls):
            return Column(Integer, ForeignKey('tests.id'), nullable=True)

    @declared_attr
        def triggered(cls):
            return relationship('TestParent',
                                foreign_keys='TestParent.triggered_by_id',
                                lazy='joined',
                                cascade='save-update, merge, delete, delete-orphan',
                                backref=backref('triggered_by', remote_side=[id])
                                )


class TestParent(HasId, Model):
    __tablename__ = 'tests'

    discriminator = Column(String(50))

    __mapper_args__ = {'polymorphic_on': discriminator}


class FooTest(TestParent):
    __tablename__ = 'footests'
    __mapper_args__ = {'polymorphic_identity': 'footests'}
    id = Column(Integer, ForeignKey('tests.id'), primary_key=True)

    bar = Column(Boolean)
    ...

当 IO 尝试构建此数据库时,由于我在 triggered_by 关系上定义 backrefremote_side 导致错误。

完整的错误是

ArgumentError: Column-based expression object expected for argument 'remote_side'; got: '<built-in function id>', type <type 'builtin_function_or_method'>

【问题讨论】:

  • 你为什么要把triggeredtriggered_by_id放在HasId而不是TestParent上?

标签: python sqlalchemy


【解决方案1】:

解决方案是将backref定义从

backref('triggered', remote_side=[id])

backref('triggered', remote_side='TestParent.id')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2010-12-19
    相关资源
    最近更新 更多