Результаты фильтра алхимии sql по свойствам объединенных моделей - PullRequest
1 голос
/ 09 октября 2011

У меня есть модель X и модель Y.

Y содержит ссылку на внешний ключ для X.id, с экземпляром связанной записи X, доступной свойством x.

x_id = Column(Integer, ForeignKey('xtable.id'))    
x = relationship('X')

X также имеет логическое свойство publish.

Выполняя запрос по Y, как я могу отфильтровать результаты по тем, где x.publish имеет значение True;

Я пытался сделать что-то вроде этого:

DBSession.query(Y).filter_by(x.publish = True).all() 

Но это не работает, я получаю сообщение о том, что ключевое слово не может быть выражением. Я просмотрел документацию по алхимии, но не могу найти то, что искал. Есть предложения?

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

Другой вариант -

Вы можете создать прямую новую связь

Как

x1 = relationship(X,
             primaryjoin='and_(X.id==Y.x_id, X.publish==True)'
             )

Это автоматически присоединится.

3 голосов
/ 09 октября 2011

Вам необходимо добавить join в запросе к классу X и использовать filter вместо filter_by:

qry = DBSession.query(Y)
qry = qry.join(X)
qry = qry.filter(X.publish == True)
qry.all()

или сразу:

DBSession.query(Y).join(X).filter(X.publish == True).all()

См. этот вопрос относительно разницы между использованием filter и filter_by.

...