Подтвердить что ты не робот

sqlalchemy: объект InstrumentedList не имеет атрибута 'filter'

У меня есть следующие 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" не имеет атрибута "фильтр" - я просмотрел документацию и не могу это понять. Что мне не хватает, чтобы я мог фильтровать ресурсы, соответствующие среде в моем методе get_resource?

PS: Я знаю, что get_resource будет генерировать исключение, что бы мне хотелось.

4b9b3361

Ответ 1

Чтобы работать с отношениями как с Query, вам нужно настроить его с помощью lazy='dynamic'. Подробнее об этом см. В Dynamic Relationship Loaders:

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