Я использую 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))
но есть ли способ вместо этого использовать строку в качестве первичного соединения?






Я только сейчас разрабатываю что-то новое, но вот как я бы предложил это:
db.query(Object).filter(Object.first==value).filter(Object.second==False).all()
Я думаю, это то, что вы пытаетесь сделать, верно?
(Примечание: написано в веб-браузере, а не в реальном коде!)
Не беспокойся. Думаю, я понимаю, что вы пытаетесь сделать, но в основном я читаю предоставленный вами код!
Функция and_ () - это правильный способ выполнения логических соединений в SQLAlchemy вместе с оператором &, но будьте осторожны с последним, поскольку он имеет удивительные правила приоритета, то есть более высокий приоритет, чем операторы сравнения.
Вы также можете использовать строку в качестве основного соединения с конструктором text (), но это приведет к разрыву вашего кода с любым псевдонимом таблицы, который идет с нетерпеливой загрузкой и объединениями.
Для логического удаления может быть лучше сопоставить весь класс с выбором, который игнорирует удаленные значения:
mapper(Something, select([sometable], sometable.c.deleted == False))
Можно ли это перевести на использование mapper_args? То есть я использую декларативную.
Я попытался использовать его в mapper_args, но получил сообщение об ошибке: «mapper () получил несколько значений для аргумента ключевого слова 'local_table'». Так что, боюсь, это бесполезно.
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)"
Это сработало для меня!
Нет, искал автомат .. Уточню вопрос :) Хотя спасибо!