2012-03-27 16 views
4

association_proxyを使用しようとしたときにエラーが発生しました。0-n関係のAssociation_proxy

Iをassociation_proxyはC.

class C(base): 
    a = association_proxy('b', 'a') 

からアクセスすることであるB. B 0-nの関係を有するクラスAは、C 0-nの関係を有すること場合は、問題なく動作するマッピングされてしまいました実際にははBとの関係がありますが、この関係がnullの場合、myCinstance.aにアクセスしようとすると、AttributeError 'NoneType' object has no attribute 'a'がスローされます。 1-nリレーションでうまくいくと思いますが、myCinstance.aがエラーではなくNoneを返す方法がありますか? (私は創作者のオプションを見ましたが、セッティングのためにしか見えないように見えます)。

ありがとうございます。私はSQLAlchemyの0.7.5

EDITを使用してい

:私はあなたが発行されたときにケースが処理されていることをhttp://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html#querying-with-association-proxiesを読んでからhttps://gist.github.com/2225046

+0

これはhttp://stackoverflow.com/questions/9063478/how-to-の複製ではありません拡張機能のgetter-functionality-of-sqlalchemys-association-proxy? –

+0

私のユースケースの1つ(myCinstance.aにアクセス)で動作します。しかし、 '.query(C).filter(C.a == ...)'のようなクエリをフィルタリングすることはできません。 – tonio

答えて

7

は、私は信じている問題を説明する簡単な例を思い付い(すなわち、SQLはEXISTS節を使用して既存のB問題を捕捉します)。

アクセサショートカットが仕事を得るためには、あなたがgetset_factory引数を使用する必要があります。

def outer_join_accessor_factory(collection_type, proxy): 
    def getter(obj): 
     if obj is None: 
      return None 
     return getattr(obj, proxy.value_attr) 
    def setter(obj, value): 
     setattr(obj, proxy.value_attr, value) 
    return getter, setter 

class C(Base): 
    __tablename__ = 'c' 
    id = Column(Integer, primary_key=True) 
    id_b = Column(Integer, ForeignKey('b.id')) 
    b = relationship('B', backref='cs') 
    a = association_proxy('b', 'a', getset_factory=outer_join_accessor_factory) 
+0

すごく感謝! – tonio

+0

また、SQLAlchemyにはこの部分がないので、getset_factoryの素晴らしい例です。 –