我在这里使用连接表继承。在
class BaseEntity(Base):
some_col = Column(String)
base_relationship = relationship("some_relationship", backref="depends_on_who_inherits_me")
class SubEntity(BaseEntity):
some_unique_col = Column(String)
因为特定的backref名称只会在运行时知道(在本例中,它应该是SubEntity
,但是它应该能够被无限的子类继承),所以我需要depends_on_who_inherits_me
部分变量,或者更具体地说,继承子类的名称,而不是字符串。因此,每个子类都有一个引用第三方类的关系,同时让它以适当的名称引用该特定的子类。在
但是,因为这是在任何方法之外的,所以我不能使用self
灵活地引用实例。在
如何实现这一理念?谢谢。在
实现这一点的一种方法是使用^{} 的^{} 。在
这是混音课:
declared_attr
上的cascading
标志将使sqlalchemy尝试在层次结构中的每个类上呈现“mixed-in”属性。或者正如文件所说:^{} 函数允许我们在mixin中确定我们处理的是
BaseEntity
还是子类,这样我们只将关系添加到子类上。在然后将mixin继承到
^{pr2}$BaseEntity
模型中:正如您在您的问题中提到的,您正在使用联接表继承,我已经使用
@declared_attr
方法在BaseEntity
上定义了__mapper_args__
,这样polymorphic_identity
也可以从子类的类名自动生成。在因此,使用此配置,
BaseEntity
的每个子类都将对以子类命名的RelatedEntity
应用关系属性。以下是完整的工作示例:我们不能在
BaseModel
中定义related_entity()
declared_attr
方法是因为SQLAlchemy不支持级联,并且不会生成任何关系(因为if has_inherited_table(cls):
块阻止BaseModel
生成关系)。从the docs:相关问题 更多 >
编程相关推荐