sqlalchemy:'InstrumentedList'对象没有属性'filter'

Lia*_*m M 27 python sqlalchemy

我有以下3个班级:

class Resource:
    id = Column(Integer, primary_key=True)
    path = Column(Text)
    data = Column(Binary)
    type = Column(Text)

    def set_resource(self, path, data, type):
        self.path = path
        self.data = data
        self.type = type

class EnvironmentResource(Base, Resource):
    __tablename__ = 'environment_resources'
    parent_id = Column(Integer, ForeignKey('environments.id', ondelete='CASCADE'))
    def __init__(self, path, data, type):
        self.set_resource(path, data, type)

class Environment(Base):
    __tablename__ = 'environments'
    id = Column(Integer, primary_key=True)
    identifier = Column(Text, unique=True)
    name = Column(Text)
    description = Column(Text)

    _resources = relationship("EnvironmentResource",
        cascade="all, delete-orphan",
        passive_deletes=True)
    _tools = relationship("Tool",
        cascade="all, delete-orphan",
        passive_deletes=True)

    def __init__(self, name, identifier, description):
        self.name = name
        self.identifier = identifier
        self.description = description

    def get_resource(self, path):
        return self._resources.filter(EnvironmentResource.path==path).first()
Run Code Online (Sandbox Code Playgroud)

在调用get_resource时,我被告知'InstrumentedList'对象没有属性'filter' - 我已经阅读了文档并且无法解决这个问题.我缺少什么,以便我可以过滤与'get_resource'方法中的环境相对应的资源?

PS:我知道get_resource会抛出异常,这就是我想要它做的事情.

van*_*van 56

为了与工作的关系,与Query,则需要与配置它lazy='dynamic'.在动态关系加载器中查看更多相关信息:

_resources = relationship("EnvironmentResource",
    cascade="all, delete-orphan",
    lazy='dynamic',
    passive_deletes=True)
Run Code Online (Sandbox Code Playgroud)

  • 有人可以向数据库解释n00bie lazy ='dynamic'是什么意思? (8认同)
  • 类似地,如果你对`backref`有同样的问题,你需要用`backref = db.backref('items',lazy ='dynamic')替换`relation`中的`backref ='items'`` . (5认同)
  • 如果没有lazy='dynamic',您可以直接在env.environment_resource 上获得结果。但是使用lazy='dynamic',它会返回一个<sqlalchemy.orm.dynamic.AppenderBaseQuery> - 你可以做str(env.environment_resource) 它会给你SQL 查询,你可以在上面添加过滤器等 (3认同)