【问题标题】:Dynamically applied filter on (self-referential) relationship对(自引用)关系动态应用过滤器
【发布时间】:2013-12-12 20:18:11
【问题描述】:

我有一个模型,我想使用过滤器进行查询。我还希望将此过滤器应用于其子级(一对多的自引用关系)。示例:

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?或者给它一个参数?)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    请注意,如果您有多个相同颜色的商品,您的原始查询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
    

    因为childrendynamicmy_item.children 会返回一个查询。在这种情况下,您只需应用另一个过滤器即可完成:

    my_blue_children = my_item.children.filter(Item.color == 'blue').all()
    

    filter 子句现在将对加载子项的 select 语句应用过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      相关资源
      最近更新 更多