Как добавить автоматический фильтр в отношение с SQLAlchemy? - PullRequest
9 голосов
/ 06 ноября 2008

Я использую SQLAlchemy 0.5rc, и я хотел бы добавить в отношение автоматический фильтр, чтобы каждый раз, когда он пытается извлечь записи для этого отношения, он игнорирует «удаленные», если они помечены as "logically_deleted" (логическое поле дочерней таблицы)

Например, если у объекта "parent" есть отношение "children", которое имеет 3 записи, но одна из них логически удалена, когда я запрашиваю «Parent», я бы хотел, чтобы SQLA получить родительский объект только с двумя детьми ..
Как я должен это делать? Добавляя условие "и" к основному соединению параметр отношения? (например, "Children.parent_id == Parent.id and Children.logically_deleted == False", но правильно ли писать "и" таким образом?)

Edit:
Мне удалось сделать это таким образом

children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False))

но есть ли способ использовать строку вместо primaryjoin?

Ответы [ 3 ]

8 голосов
/ 15 декабря 2012

но есть ли способ использовать строку вместо primaryjoin?

Вы можете использовать следующее:

children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)"

Это сработало для меня!

3 голосов
/ 10 ноября 2008

Функция and_ () - это правильный способ выполнения логических соединений в SQLAlchemy вместе с оператором &, но будьте осторожны с последним, поскольку он имеет удивительные правила приоритета, то есть более высокий приоритет, чем операторы сравнения.

Вы также можете использовать строку в качестве основного соединения с конструктором text (), но это приведет к разрыву кода при любом псевдониме таблиц, который идет с eagerloading и объединениями.

Для логического удаления, возможно, было бы лучше отобразить весь класс поверх выбора, который игнорирует удаленные значения:

mapper(Something, select([sometable], sometable.c.deleted == False))
0 голосов
/ 06 ноября 2008

Я только сейчас разрабатываю версию 0.4.что-то, но вот как я бы это предложил:

db.query(Object).filter(Object.first==value).filter(Object.second==False).all()

Я думаю, это то, что вы пытаетесь сделать, верно?

(Примечание: написано в веб-браузере, а не в реальном коде!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...