Sqlalchemy 如何使用before_flush()限制特定对象的刷新

Sqlalchemy 如何使用before_flush()限制特定对象的刷新,sqlalchemy,Sqlalchemy,我有三张表:适合度、性格和技能。每个字符都有一个技能列表,其中的技能级别可以更改。每个Fit都属于字符,而字符可以拥有任意数量的Fit 我希望用户能够临时更改角色的技能级别。也就是说,当他们更改它时,他们可以关闭程序并丢失更改,或者选择保存他们所做的更改。这似乎很难做到,原因有三: 任何时候角色对象发生变化(包含技能对象列表),它都会作为脏对象添加到会话中。这就引出了下一个问题 当程序中的任何其他内容发生更改时(修改Fit对象,用户创建新的字符s等),程序将执行刷新/提交,其中包括对以前的字符

我有三张表:适合度、性格和技能。每个
字符
都有一个
技能
列表,其中的技能级别可以更改。每个
Fit
都属于
字符
,而
字符
可以拥有任意数量的Fit

我希望用户能够临时更改
角色的技能级别。也就是说,当他们更改它时,他们可以关闭程序并丢失更改,或者选择保存他们所做的更改。这似乎很难做到,原因有三:

  • 任何时候
    角色
    对象发生变化(包含技能对象列表),它都会作为脏对象添加到会话中。这就引出了下一个问题
  • 当程序中的任何其他内容发生更改时(修改
    Fit
    对象,用户创建新的
    字符
    s等),程序将执行刷新/提交,其中包括对以前的字符所做的临时更改
  • 我不希望
    expunge()
    从会话中删除角色,因为当加载新的fit时,它将从数据库中加载新的character对象。这是不需要的,因为我希望将修改后的字符用于指定给该字符的所有配合,并且我不希望有额外的字符对象四处浮动
基本上,我希望用户调整
字符
对象,而不必担心使用另一个更改的会话刷新/提交保存它


我曾经考虑过在flush
事件之前使用SQLalchemys
,但是使用它的例子似乎很少。我设想在角色发生更改时设置一个属性,然后在刷新之前检查该属性。如果它具有此属性,请将其从刷新池中删除,并刷新/提交所有其他更改。我想这正是我需要的,但是我不知道如何处理这些事件

有很多方法可以做到这一点。一个可能的解决方案是创建一个“临时”来存储临时技能。创建一个

不要忘了覆盖constructot以创建该字段

def Skill: 
    @orm.reconstructor
    def init_on_load(self):
        self.current_skill = self.skill

    def save_current_skill():
         self.skill = self.curent_skill