Взгляните на выражения SQL в качестве сопоставленных атрибутов . Что-то вроде этого должно сделать работу за вас:
Book.read = column_property(
select(
[func.count(user_to_book_table.c.user_id)],
user_to_book_table.c.book_id == book_table.c.id
).label('read')
)
Даже если это не булево значение, вы все равно можете использовать его в выражениях IF правильно:
if mybook.read:
print 'very popular book indeed'
В качестве альтернативы вы можете просто добавить вычисляемое (только для чтения) свойство к объекту Book, но это загрузит всех пользователей в ваш сеанс:
@property
def read(self):
return len(self.books)!=0