与0n个关系关联的代理

2024-04-19 22:13:59 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试使用关联代理时出错。在

我得到了映射类A,与B的关系为0-n。B与C的关系为0-n。关联代理将从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而不是一个错误?(我看到了creator选项,但看起来只用于设置,而不是获取)。在

提前谢谢。在

我使用的是SqlAlchemy 0.7.5

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


Tags: no代理baseobject关系attributenullclass
1条回答
网友
1楼 · 发布于 2024-04-19 22:13:59

我从阅读http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html#querying-with-association-proxies中相信,当您发出一个查询(即SQL使用EXISTS子句来捕捉不存在的B问题)时,这种情况就得到了处理。在

要使访问器快捷方式正常工作,需要使用getset\u 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)

相关问题 更多 >