2012-07-20 16 views
17

を持っていない私は、次の3つのクラスがあります。get_resourceを呼んでSQLAlchemyの「InstrumentedList」オブジェクトが属性「フィルタ」

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

は、私が「InstrumentedList」オブジェクトが属性「フィルタ」を持っていないことを告げています - 私は」ドキュメンテーションを見て、これを理解することはできません。何が欠けているので、私の 'get_resource'メソッド内の環境に対応するリソースをフィルタすることができるでしょうか?

PS:私はget_resourceが例外をスローすることを知っています。それは私がしたいことです。

答えて

35

relationshipQueryとして使用するには、lazy='dynamic'を設定する必要があります。 Dynamic Relationship Loaders

+8

で詳細をご覧ください。誰かがデータベースに説明してくださいn00bie lazy = 'dynamic'とはどういう意味ですか? – appleLover

+3

同様に、 'backref'と同じ問題がある場合、' backref = db.backref( 'items'、lazy = 'dynamic')のようなもので 'relationship'の' backref = 'items''を置き換える必要があります。 '。 –

+1

lazy = 'dynamic'を指定しないと、env.environment_resourceで直接結果が得られます。しかし、lazy = 'dynamic'を指定すると、を返します。str(env.environment_resource)を実行すると、フィルタなどを使用してSQLクエリを実行できます –

関連する問題