代码之家  ›  专栏  ›  技术社区  ›  minovsky

过滤SQLAlchemy关系

  •  5
  • minovsky  · 技术社区  · 13 年前

    我正在使用Pyramid+SQLAlchemy,并进行了以下设置

    from sqlalchemy import orm
    from __init__ import user_table  
    from device import Device
    
    class User(object):
      def __repr__(self):
        return 'User: ' + self.username
    
    orm.mapper(User, user_table, properties={
      'devices': orm.relation(Device, backref='owner')
    })
    

    访问时如何添加筛选器 user.devices ? 当我尝试的时候 user.devices.filter(Device.platform==1).all() ,我得到以下错误:

    'InstrumentedList' object has no attribute 'filter'
    
    1 回复  |  直到 13 年前
        1
  •  6
  •   Olúwátóósìn Anímáá¹£ahun van    7 年前

    您可以使用 Query-Enabled Property :

    class User(object):
        def __repr__(self):
            return 'User: ' + self.username
    
        # property
        @property
        def devices_filtered(self):
            return object_session(self).query(Device).with_parent(self).filter(Device.platform==1).all()
    
        # or simply a method
        def devices_filtered(self, platform):
            return object_session(self).query(Device).with_parent(self).filter(Device.platform==platform).all()
    

    或查看 Dynamic Relationship Loaders :

    orm.mapper(User, user_table, properties={
      'devices': orm.relation(Device, backref='owner', lazy='dynamic')
    })
    
    # ...
    user = session.query(User).get(_some_user_id)
    devices = user.devices.filter(Device.platform==platform).all()
    

    只需阅读参考文档即可获得有关主题的完整解释。