渴望加载多态集合类层次结构

时间:2015-01-30 09:54:57

标签: python inheritance orm sqlalchemy

我的声明性类声明如下所示:

class ExportJob(db.Model):
    # has foreign key to paramset
    backgroundtask = db.relationship(BackgroundTask, backref="exportjob")
    params = db.relationship("ParamSet")

class ParamSet(db.Model):
    __tablename__ = "paramset"
    paramvalues = db.relationship("Param", backref="paramset")    

class Param(db.Model):
    __tablename__ = "param"

    id = db.Column(db.Integer, primary_key=True)
    paramset_id = fkey("paramset", index=True)

    name = db.Column(db.Unicode(50), nullable=False)
    type = db.Column(db.Unicode(10))

    __mapper_args__ = {
        'polymorphic_on': type
    }

class IntegerParam(Param):
    __tablename__ = "integerparam"
    value = db.Column(db.Integer, nullable=False)    
    __mapper_args__={
        "polymorphic_identity": "int"
    }

class BoolParam(Param):
    ...

class DateParam(Param):
    ...

class SomeRelatedParam(Param):
    __tablename__ = "somerelatedparam"
    related_id = db.Column(db.Integer, db.ForeignKey(...))
    value = db.relationship(SomeRelatedModelClass)
    __mapper_args__ = {...}

我的目标是急切地(使用joinload或子查询加载)一个带有关联的ParamSet的ExportJob和所有类型的所有参数。

我该怎么做?

我试过了:

q = ExportJob.query
q = q.options(subqueryload_all(
    ExportJob.params,
    ParamSet.paramvalues,
))

但是如何指定急切加载所有不同的Param类型?

1 个答案:

答案 0 :(得分:1)

这似乎可以解决问题:

q = ExportJob.query
q = q.options(joinedload_all(
    ExportJob.params,
    ParamSet.paramsvalues.of_type(with_polymorphic(Param, "*", aliased=True)),
))