2012-07-20 24 views
17

Ich habe die folgenden drei Klassen:sqlalchemy: 'InstrumentedList' Objekt hat kein Attribut 'Filter'

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

Auf get_resource Aufruf, wie ich höre, dass 'InstrumentedList' Objekt kein Attribut 'Filter' hat - I Ich habe die Dokumentation durchgelesen und kann das nicht genau herausfinden. Was fehlt mir, damit ich in der Lage bin, die Ressourcen zu filtern, die einer Umgebung innerhalb meiner Methode 'get_resource' entsprechen?

PS: Ich weiß get_resource wird eine Ausnahme werfen, das ist, was ich es tun möchte.

Antwort

35

Um mit dem relationship wie mit Query zu arbeiten, müssen Sie es mit lazy='dynamic' konfigurieren. Sehen Sie mehr dazu in Dynamic Relationship Loaders:

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

könnte jemand bitte erklären, in einer Datenbank n00bie was faul = ‚dynamische‘ bedeutet und tut? – appleLover

+3

Ähnlich, wenn Sie das gleiche Problem mit einem 'backref' haben, müssen Sie' backref = 'items' in 'relation' durch etwas wie' backref = db.backref (' items ', lazy =' dynamic ') ersetzen '. –

+1

ohne faul = 'dynamisch', erhalten Sie direkt das Ergebnis auf env.environment_resource. Aber mit Lazy = 'dynamic', gibt es eine - Sie können str (env.environment_resource) ausführen und es gibt Ihnen die SQL-Abfrage, auf die Sie Filter etc. setzen können –

Verwandte Themen