【问题标题】:Eager loading of polymorphic collection class hierarchy多态集合类层次结构的渴望加载
【发布时间】:2015-03-29 18:32:17
【问题描述】:

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

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__ = {...}

我的目标是使用相关的 ParamSet 和所有类型的所有参数急切地加载(使用joinedload 或subqueryload)一个ExportJob。

我该怎么做?

我试过了:

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

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

【问题讨论】:

    标签: python inheritance orm sqlalchemy


    【解决方案1】:

    这似乎可以解决问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 2013-04-15
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多