我正在尝试从已加入的固定表中进行多态加载(我使用Flask-Sqlalchemy)。
class Sip(db.Model):
id = db.Column(db.Integer, primety_key=True)
identity = db.Column(db.String(10))
__mapper_args__ = {'polymorphic_identity': 'sip', 'polymorphic_on': identity}
class Device(Sip):
id = db.Column(db.Integer, db.ForeignKey('sip.id', ondelete='CASCADE'), primary_key=True)
__mapper_args__ = {'polymorphic_identity': 'dev'}
class Line(Sip):
id = db.Column(db.Integer, db.ForeignKey('sip.id', ondelete='CASCADE'), primary_key=True)
__mapper_args__ = {'polymorphic_identity': 'line'}
我有一个Device对象和一个Line对象。当我尝试进行这样的查询时:
Sip.query.with_polymorphic(Device).all()
它返回所有对象
[<myapp.models.Device at 0x45cfc50>, <myapp.models.Line at 0x45cfa90>]
当我使用Line作为with_polymorphic()
的参数时,情况相同。表“sip”包含所有必需的身份,我可以检查它:
>> Sip.query.with_polymorphic(Device).all()[0].identity
>> u'dev'
>> Sip.query.with_polymorphic(Device).all()[1].identity
>> u'line'
我无法弄清楚发生了什么。一切似乎都与doc示例完全一样。 感谢。
答案 0 :(得分:4)
with_polymorphic
不按类型过滤对象,但仅定义在初始查询期间从中获取其他表的列。因此,如果您未在查询中使用with_polymorphic
,并且想要获取存储在Line
表中的lines
属性的值,则SA将发出另一个SQL
从数据库中获取属性的语句。
在引擎中启用echo=True
,您将看到根据with_polymorphic
用法生成了不同的SQL语句:
sips
表中的属性with_polymorphic(Device)
:也会加载devices
表的属性(使用LEFT JOIN
s)with_polymorphic("*")
:将为同一查询中的所有子类加载属性。有关该主题的更多信息,请阅读Basic Control of Which Tables are Queried。