Как добавить автоматический фильтр к отношению с SQLAlchemy?

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

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

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

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

но есть ли способ вместо этого использовать строку в качестве первичного соединения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
0
2 196
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Нет, искал автомат .. Уточню вопрос :) Хотя спасибо!

Joril 06.11.2008 12:28

Не беспокойся. Думаю, я понимаю, что вы пытаетесь сделать, но в основном я читаю предоставленный вами код!

Matthew Schinckel 06.11.2008 14:45
Ответ принят как подходящий

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

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

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

mapper(Something, select([sometable], sometable.c.deleted == False))

Можно ли это перевести на использование mapper_args? То есть я использую декларативную.

Marconi 23.04.2012 04:03

Я попытался использовать его в mapper_args, но получил сообщение об ошибке: «mapper () получил несколько значений для аргумента ключевого слова 'local_table'». Так что, боюсь, это бесполезно.

Jiangge Zhang 10.05.2012 17:34

but is there a way to use a string as primaryjoin instead?

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

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

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

Другие вопросы по теме