Association_proxy с 0-н отношениями - PullRequest
4 голосов
/ 27 марта 2012

Я получил ошибку при попытке использовать association_proxy.

Я получил сопоставленный класс A с отношением 0-n к B. B имеет отношение 0-n к C. Association_proxy предназначен для доступа к A из C.

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 Ответ

7 голосов
/ 28 марта 2012

Я полагаю, прочитав 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...