【问题标题】:sqlalchemy: 'InstrumentedList' object has no attribute 'filter'sqlalchemy:“InstrumentedList”对象没有属性“过滤器”
【发布时间】:2023-04-02 00:50:01
【问题描述】:

我有以下 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()

在调用 get_resource 时,我被告知 'InstrumentedList' 对象没有属性 'filter' - 我已经阅读了文档并且无法完全弄清楚这一点。我错过了什么,以便我可以过滤与我的“get_resource”方法中的环境相对应的资源?

PS:我知道 get_resource 会抛出异常,这就是我希望它做的事情。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    要像使用Query 一样使用relationship,您需要使用lazy='dynamic' 对其进行配置。在Dynamic Relationship Loaders 中查看更多信息:

    _resources = relationship("EnvironmentResource",
        cascade="all, delete-orphan",
        lazy='dynamic',
        passive_deletes=True)
    

    【讨论】:

    • 有人可以向数据库 n00bie 解释一下lazy='dynamic' 的含义和作用吗?
    • 同样,如果您对backref 有同样的问题,您需要将relationship 中的backref='items' 替换为backref=db.backref('items', lazy='dynamic') 之类的东西。
    • 没有lazy='dynamic',你可以直接在env.environment_resource 上得到结果。但是使用lazy='dynamic',它会返回一个 - 你可以做 str(env.environment_resource) 它会给你SQL查询,你可以在上面添加过滤器等
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2015-12-06
    • 2012-12-02
    相关资源
    最近更新 更多