用SQLAlchemy表示的Django多表继承

时间:2014-02-17 22:12:21

标签: django inheritance sqlalchemy

如何将django的多表继承模式转换为SQLAlchemy模型?

似乎SQLAlchemy连接表继承方法需要父表上的鉴别器列。使用Django的多表继承,没有这样的字段。

class CommonParent(models.Model):
     field = models.CharField(max_length=10)

class ChildA(CommonParent):
    pass

class ChildB(CommonParent):
    pass

这会产生3个表:ChildAChildBCommonParent。子表具有添加的自动外键,(parent class name)_ptr。 Django使用它来拉取父表列。

使用Django,单个ChildA实例会在JOIN表上生成CommonParent,并且所有字段都会合并到类实例中。

如何通过SQLAlchemy内省模型复制此行为?

任何正确方向的指针都会有很大帮助。

更新

换句话说,我需要通过调用

来通过SQLAlchemy访问上面的django模型关系
child_b = ChildB.query.first()
assert hasattr(child_b, 'field')  # field is from the parent table, `CommonParent`

我可以用Django ORM这样做:

child_b = ChildB.objects.latest()
assert hasattr(child_b, 'field') 

1 个答案:

答案 0 :(得分:2)

基本上有两种方法可以在单个模型中显示CommonParentChildA中的数据:在Django中,ChildA知道它在{{1}的表中有一个父项}。 SQLAlchemy使用不同的方法,CommonParent知道它在CommonParent的表中有一个子节点。在数据库级别,您使用Django的方法,这是您想要在SQLAlchemy代码中模仿的。

更具体地说,在Django中,无论何时查询ChildA,您只能获得与CommonParent类相关联的数据,当您查询CommonParent时,您将获得通过join子句的ChildAChildA的数据。

CommonParent类在SQLAlchemy中运行良好:

CommonParent

对于class CommonParent(Base): __tablename__ = '<tablename>' id = Column(Integer, primary_key=True) field = Column(String) 类,您要定义始终执行连接语句的自定义映射器:

ChildA

Documentation