2012-07-20 10 views
17

He los siguientes 3 clases:sqlalchemy: objeto 'InstrumentedList' no tiene atributo 'filtro'

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

Al llamar get_resource, me han dicho que el objeto 'InstrumentedList' no tiene atributo 'filtro' - I' He revisado la documentación y no puedo entenderlo. ¿Qué me estoy perdiendo, para poder filtrar los recursos correspondientes a un entorno dentro de mi método 'get_resource'?

PD: Sé que get_resource arrojará una excepción, eso es lo que me gustaría que hiciera.

Respuesta

35

Para trabajar con relationship como con Query, debe configurarlo con lazy='dynamic'. Ver más sobre esto en Dynamic Relationship Loaders:

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

podría alguien explicarme a una base de datos de n00bie qué medios lazy = 'dinámicas' y lo hace? – appleLover

+3

Del mismo modo, si tiene el mismo problema con un 'backref', necesita reemplazar' backref = 'items'' en 'relationship' con algo como' backref = db.backref (' items ', lazy =' dynamic ') '. –

+1

sin lazy = 'dynamic', obtienes directamente el resultado en env.environment_resource. Pero con lazy = 'dynamic', devuelve un - puede hacer str (env.environment_resource) y le dará la consulta SQL a la que puede agregar filtros, etc. –

Cuestiones relacionadas