如何将django的多表继承模式转换为SQLAlchemy模型?
似乎SQLAlchemy连接表继承方法需要父表上的鉴别器列。使用Django的多表继承,没有这样的字段。
class CommonParent(models.Model):
field = models.CharField(max_length=10)
class ChildA(CommonParent):
pass
class ChildB(CommonParent):
pass
这会产生3个表:ChildA
,ChildB
和CommonParent
。子表具有添加的自动外键,(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')
答案 0 :(得分:2)
基本上有两种方法可以在单个模型中显示CommonParent
和ChildA
中的数据:在Django中,ChildA
知道它在{{1}的表中有一个父项}。 SQLAlchemy使用不同的方法,CommonParent
知道它在CommonParent
的表中有一个子节点。在数据库级别,您使用Django的方法,这是您想要在SQLAlchemy代码中模仿的。
更具体地说,在Django中,无论何时查询ChildA
,您只能获得与CommonParent
类相关联的数据,当您查询CommonParent
时,您将获得通过join子句的ChildA
和ChildA
的数据。
CommonParent
类在SQLAlchemy中运行良好:
CommonParent
对于class CommonParent(Base):
__tablename__ = '<tablename>'
id = Column(Integer, primary_key=True)
field = Column(String)
类,您要定义始终执行连接语句的自定义映射器:
ChildA