[英]Dynamically applied filter on (self-referential) relationship
我有一个要使用过滤器查询的模型。 我还希望将此过滤器应用于其子级(一对多的自我参照关系)。 例:
class Item(Model):
__tablename__ = 'item'
id = Column(Integer, primary_key=True)
color = Column(String)
parent_id = Column(Integer, ForeignKey('item.id'))
children = relationship(
'Item',
backref=backref('parent', remote_side=[id]),
lazy='dynamic'
)
item = session.query(Item).filter(Item.color == 'blue').one()
现在,我想一次children
集合应用相同的过滤器,并在以后能够以透明方式访问过滤后的集合。
我可以想象像这样的东西:
item.children.apply_filter(Item.color == 'blue') # `children` is dynamic
然后访问item.children
等同于立即访问item.children.filter(Item.color == 'blue').all()
。 请注意,使用此解决方案,关系是自引用的事实无关紧要。
SQLAlchemy的API很大,我不知道是否有适当的方法来执行此操作(或等效方法)。
(是否可以在查询时修改关系的主primaryjoin
?或者给它一个参数?)
请注意,如果您有多个具有相同颜色的项目,则原始查询item = session.query(Item).filter(Item.color == 'blue').one()
将失败。
当您通过该操作并获得(父) Item
实例时:
my_item = session.query(Item).filter(Item.color == 'blue')[0]
# my_item = session.query(Item).filter(Item.color == 'blue').filter(Item.parent == None).one() # assume this is only one root item per color
由于children
是dynamic
,因此my_item.children
将向您返回查询。 在这种情况下,您只需应用另一个过滤器即可完成:
my_blue_children = my_item.children.filter(Item.color == 'blue').all()
现在, filter
子句将对选择语句加载子级应用过滤器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.