Python 在模型继承中使用selectin加载

Python 在模型继承中使用selectin加载,python,sqlalchemy,Python,Sqlalchemy,我们有一个大约25个兄弟类的层次结构,所有这些类都继承自SQLALchemy ORM模型中的父类。我们与_polimorphic:'*'一起使用,作为优化的一部分,我们决定在子类上使用polimorphic_load:'selectin' 这是一个报告过程,在这个过程中,我们需要加载每种类型的子类,以及一系列相关的项,因此我们所做的基本上是: 查询=bill.charges.offset0.limit100.options 按次收费: serialize_rowcharge这会访问很多关系,因此

我们有一个大约25个兄弟类的层次结构,所有这些类都继承自SQLALchemy ORM模型中的父类。我们与_polimorphic:'*'一起使用,作为优化的一部分,我们决定在子类上使用polimorphic_load:'selectin'

这是一个报告过程,在这个过程中,我们需要加载每种类型的子类,以及一系列相关的项,因此我们所做的基本上是:

查询=bill.charges.offset0.limit100.options 按次收费: serialize_rowcharge这会访问很多关系,因此joinloads 其中bill.charges是与lazy=dynamic的关系

我们需要这些joinload,并且我们决定使用selectin比在已经有25个表范围的连接中添加更多连接要好

问题是,我们仍然看到每行选择一个,我们不知道如何摆脱

这是我们层次结构的一部分:

这是一切之母 类别ChargeBaseModel: __表名=第三方物流费用 __映射器参数={ 多态性身份:电荷, 多态性:类型, } .... 这个班有几个兄弟姐妹,还有很多孩子 类别收费: __表名=第三方物流费收费 __mapper_args_uuu={多态加载:选择项,多态身份:费用} .... 这个班有很多兄弟姐妹 类别返回剩余费用费用费用: __tablename\uuuuu=tpl\u退货\u剩余费用\u r2 __mapper_args_uuu={polymorphic_load:selectin,polymorphic_identity:return_rements_charge} 现在,当选择同一账单的所有费用时,正如预期的那样,父表字段上的一个简单选择被减少为*因为列表非常庞大:

> SELECT * 
FROM tpl_charges_r2 
WHERE %s = tpl_charges_r2.bill_id ORDER BY tpl_charges_r2.id 
 LIMIT %s, %s
> (XXXXXXXX, 0, 10)
然后,为特定的子类选择一组连接,并为它们请求的关系添加连接和一个WHERE id IN。。。。条款,如预期:

SELECT * 
FROM tpl_charges_r2 INNER JOIN tpl_fee_charges_r2 ON tpl_charges_r2.id = tpl_fee_charges_r2.id INNER JOIN tpl_return_remainder_charges_r2 ON tpl_fee_charges_r2.id = tpl_return_remainder_charges_r2.id LEFT OUTER JOIN (tpl_fees AS tpl_fees_1 INNER JOIN tpl_returning_fees AS tpl_returning_fees_1 ON tpl_fees_1.id = tpl_returning_fees_1.id) ON tpl_returning_fees_1.id = tpl_fee_charges_r2.fee_id LEFT OUTER JOIN ...... 
WHERE tpl_charges_r2.id IN (%s, %s, %s, %s, %s, %s, %s) ORDER BY tpl_charges_r2.id
> (60899453, 60899455, 60899456, 60899457, 60899458, 60899459, 60899460)
请注意最后一个id 60899460

现在,当我们实际获取每个项并对其进行序列化时,在序列化代码运行之前,将为每个对象运行此查询:

它从第二个父表中选择所有字段

我意识到并不是所有的字段都是按类型选择加载的,原因可能是对象实际上不是中间类型,而是子类型。理想情况下,我们可以配置子类以加载加入的FeeCharge数据,或者在父类上与_polymorphic:FeeCharge一起使用,以便只加入该表,但我们不能这样做,因为它似乎不接受字符串,它想要该类,并且在该点上没有定义该类

有办法解决这个问题吗?我们是否可以加载一个3级层次结构,而不必进行巨大的联接或每行选择

我尝试过使用orm.with_多态性,但我不知道如何将它与lazy=动态关系结合起来。作为最后手段,我们可以复制这种关系中的逻辑,但我们希望保持现状

> SELECT tpl_fee_charges_r2.bill_fee_id AS tpl_fee_charges_r2_bill_fee_id, tpl_fee_charges_r2.fee_id AS tpl_fee_charges_r2_fee_id, tpl_fee_charges_r2.unit_amount AS tpl_fee_charges_r2_unit_amount, tpl_fee_charges_r2.occurred_at AS tpl_fee_charges_r2_occurred_at 
FROM tpl_fee_charges_r2 
WHERE %s = tpl_fee_charges_r2.id AND tpl_fee_charges_r2.id = %s
> (60899460, 60899460)