Комментатор выше прав в том, что в сессию нельзя передавать объекты ORM. Однако автор и не пытается (осознанно) передать в сессию объект. Он думает, что в методе __iter__ добавляет объект product к копии self.favorites, а затем отдаёт в yield, не меняя исходный self.favorites. Увы, исходный self.favorites всё же меняется, и в сессию пытается пролезть объект ORM. Для решения проблемы нужно изменить способ копирования объекта self.favorites.
Импортируем модуль copy и заменяем favorites = self.favorites.copy() на favorites = copy.deep_copy(self.favorites)
Должно сработать.