Association_proxy与0-n关系

时间:2012-03-27 14:54:54

标签: python sqlalchemy

尝试使用association_proxy时遇到错误。

我得到了映射的类A,与B的0-n关系.B与C的0-n关系.association_proxy是从C访问A.

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

如果确实与B有关系,那么它没有问题。但是如果这个关系是null,那么尝试访问myCinstance.a会抛出:AttributeError 'NoneType' object has no attribute 'a'。 我猜它适用于1-n关系,但myCinstance.a是否有一种方式可以返回None而不是错误? (我看到了创建者选项,但看起来只是为了设置,而不是获取)。

提前致谢。

我正在使用SqlAlchemy 0.7.5

编辑:我想出了一个描述问题的简单示例https://gist.github.com/2225046

1 个答案:

答案 0 :(得分:7)

我相信阅读http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html#querying-with-association-proxies时,在发出查询时处理案例(即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)