2012-07-20 26 views
17

Ho i seguenti 3 classi:SQLAlchemy: oggetto 'InstrumentedList' non ha alcun attributo '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() 

A chiamare get_resource, mi viene detto che l'oggetto 'InstrumentedList' non ha alcun attributo 'filtro' - I' Ho esaminato la documentazione e non riesco a capirlo. Cosa mi manca, in modo che possa essere in grado di filtrare le risorse corrispondenti ad un ambiente all'interno del mio metodo 'get_resource'?

PS: So che get_resource genererà un'eccezione, è quello che mi piacerebbe fare.

risposta

35

Per lavorare con relationship come con Query, è necessario configurarlo con lazy='dynamic'. Vedi più su questo in Dynamic Relationship Loaders:

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

Qualcuno potrebbe spiegare a un database di n00bie cosa pigri = significa 'dinamici' e lo fa? – appleLover

+3

Analogamente, se hai lo stesso problema con un 'backref', devi sostituire' backref = 'items'' in 'relationship' con qualcosa come' backref = db.backref (' items ', lazy =' dynamic ') '. –

+1

senza lazy = 'dynamic', si ottiene direttamente il risultato su env.environment_resource. Ma con lazy = 'dynamic', restituisce una - puoi fare str (env.environment_resource) e ti darà la query SQL su cui puoi applicare il filtro ecc. –

Problemi correlati