class Account(Base):
    __tablename__ = 'account'
    id = Column(Integer, primary_key=True)
    taxes = relationship('Tax',
                         primaryjoin='and_(Account.id == Tax.account_id,'
                                     'Tax.removed == False)',
                         collection_class=attribute_mapped_collection('id'),
                         cascade='all')
    def create_tax(self, id_, name):
        c = Tax(id=id_, name=name)
        self.taxes[c.id] = c
    def remove_tax(self, id_):
        contribution = self.taxes[id_]
        contribution.removed = True
class Tax(Base):
    __tablename__ = 'tax'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    account_id = Column(Integer, ForeignKey(Account.id), nullable=False)
    removed = Column(Boolean, nullable=False, default=False)
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
if __name__ == '__main__':
    account = Account(id=1)
    account.create_tax(id_=1, name='General tax')
    account.create_tax(id_=2, name='Selective tax')
    assert len(account.taxes) == 2
    account.remove_tax(id_=1)
    assert len(account.taxes) == 1

Проблема в следующем: с веба приходит список действий, которые необходимо выполнить для изменения коллекции account.taxes. Это либо создание, либо удаление налогов. При этом при создании налога необходимо проверять, не выходит ли количество налогов за определенное ограничение, т.е. коллекция должна быть актуальна, и мы всегда должны знать ее длину. Но при выполнении account.remove_tax коллекция остается в прежнем состоянии, т.к. на самом деле налог не удаляется из нее, а для него устанавливается флаг removed = True. Актульной эта коллекция будет только при следующей загрузке из БД.
Если удалять налог из коллекции, то это приводит к обнулению Tax.account_id и ошибке при коммите.
Можно ли как-то настроить отношение, чтобы при удалении налога из коллекции не обнулялся account_id, и он оставался в БД с флагом removed = True?