2012-07-20 22 views
17

vardır:sqlalchemy: 'InstrumentedList' nesne aşağıdaki 3 sınıfları var hiçbir özellik 'filtre'

get_resource arayan üzerinde
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() 

, ben 'InstrumentedList' nesne hiçbir özellik 'filtre' sahip olduğunu söyledi am - Ben ve belgelerin içinden geçti ve bunu çözemedim. Neyi özlüyorum, böylece 'get_resource' yöntemimin içindeki bir ortama karşılık gelen kaynakları filtreleyebilir miyim?

Not: get_resource'ın bir istisna atacağını biliyorum, bunu yapmak isterim.

cevap

35

Query ile relationship ile çalışmak için lazy='dynamic' ile yapılandırmanız gerekir. Dynamic Relationship Loaders bu konuyu daha bakınız:

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

birisi bir veritabanı n00bie ne tembel = 'dinamik' demektir açıklamak ve yapar misin? – appleLover

+3

Benzer şekilde, bir "backref" ile aynı sorunu yaşıyorsanız, 'backref =' items' '' '' '' '' '' '' '' '' '' '= '', '', '' teması '' gibi bir şeyle '' ilişki '' 'değiştirmeniz gerekir. '. Lazy = 'dynamic' olmaksızın –

+1

, doğrudan env.environment_resource sonucunu alırsınız. Ama tembel = 'dinamik' ile, bir döndürür - str (env.environment_resource) yapabilir ve size filtre vb üzerine yapıştırabileceğiniz SQL sorgusunu verir. –

İlgili konular