SQLAlchemy 关系上的过滤

5 投票
1 回答
6057 浏览
提问于 2025-04-17 17:58

我正在使用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 个回答

6

你可以使用一个叫做 查询启用属性 的东西:

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()

或者看看 动态关系加载器

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()

想要了解这些主题的详细信息,可以去阅读上面提到的文档。

撰写回答