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