sqlalchemy中的值更改后如何触发事件

MughtyWinky

我正在使用sqlalchemy定义映射的类。它包含三个用户定义的值(abc)和一个从属值(abc),使用abc计算得出我想将侦听器附加到abc它们的值更改时会更新abc使用会event.listen(variable.a, 'set', updateFunction)调用该函数,该函数应更新abc不幸的是,将新值存储在变量中之前触发该事件因此,将使用旧值计算abc

例:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, Numeric, Sequence
from sqlalchemy import event

base = declarative_base()

class demo(base):
    __tablename__ = 'demo'

    id = Column(Integer, Sequence('some_id_seq'), primary_key=True)
    a = Column(Integer)
    b = Column(Integer)
    c = Column(Integer)
    abc = Column(Numeric) #calculated from a, b, and c

    def __init__(self, A, B, C):
        self.a = A
        self.b = B
        self.c = C

        self.calcABC() #initial calculation of abc

        event.listen(demo.a, 'set', self.calcABCEvent, named=True)
        event.listen(demo.b, 'set', self.calcABCEvent, named=True)
        event.listen(demo.c, 'set', self.calcABCEvent, named=True)

    #super complicated formular
    def calcABC(self):
        self.abc = ( self.a + self.b ) * self.c

    #This event ist called, before the new value is set
    #Thus the calculation is not correct
    def calcABCEvent(self, target, value, oldvalue, initiator):
        print("\nevent called")
        print(f"self.a \t\t{self.a}")
        print(f"target.a \t{target.a}")
        print(f"oldvalue \t{oldvalue}")
        print(f"value \t\t{value}") #The new value only appears in value

        self.calcABC()

    def __str__(self):
        return f"({self.a} + {self.b}) * {self.c} = {self.abc}"

print("init")
obj = demo(1,2,3)
print(obj) #abc should be (1+2)*3 = 9

print("\nchange a to 4")
obj.a = 4

print("\nchanged object")
print(obj) #abc should be (4+2)*3 = 18

输出:

init
(1 + 2) * 3 = 9

change a to 4

event called
self.a      1
target.a    1
oldvalue    1
value       4

changed object
(4 + 2) * 3 = 9

如何仅使用一个功能更新abc在我的应用程序中,abc是使用七个变量来计算的,我想避免编写七个更新函数。有类似的东西event.listen(variable.a, 'after_set', updateFunction)吗?

MughtyWinky

在学习了属性之后发现了类似的疑问:通过SqlAlchemy中的@property实现Python getter和setter

我的解决方案如下所示:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, Numeric, Sequence
from sqlalchemy.ext.hybrid import  hybrid_property

base = declarative_base()

class demo(base):
    __tablename__ = 'demo'

    id = Column(Integer, Sequence('some_id_seq'), primary_key=True)
    _a = Column("a", Integer)
    _b = Column("b", Integer)
    _c = Column("c", Integer)
    abc = Column(Numeric) #calculated from a, b, and c

    def __init__(self, A, B, C):
        self._a = A
        self._b = B
        self._c = C
        self.calcABC() #inital calculation of abc

    #super complicated formular
    def calcABC(self):
        self.abc = ( self._a + self._b ) * self._c

    def __str__(self):
        return f"({self._a} + {self._b}) * {self._c} = {self.abc}"

    @hybrid_property
    def a(self):
        return self._a

    @a.setter
    def a(self, a):
        self._a = a
        self.calcABC()


    @hybrid_property
    def b(self):
        return self._b

    @b.setter
    def b(self, b):
        self._b = b
        self.calcABC()


    @hybrid_property
    def c(self):
        return self._c

    @c.setter
    def c(self, c):
        self._c = c
        self.calcABC()

print("init")
obj = demo(1,2,3)
print(obj) #abc should be (1+2)*3 = 9

print("\nchange a to 4")
obj.a = 4
print(obj) #abc should be (4+2)*3 = 18

print("\nchange b to 5")
obj.b = 5
print(obj) #abc should be (4+5)*3 = 27

print("\nchange c to 6")
obj.c = 5
print(obj) #abc should be (4+5)*6 = 54

产生以下输出

init
(1 + 2) * 3 = 9

change a to 4
(4 + 2) * 3 = 18

change b to 5
(4 + 5) * 3 = 27

change c to 6
(4 + 5) * 6 = 54

Process finished with exit code 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

jQuery中未触发值更改事件

来自分类Dev

jQuery中未触发值更改事件

来自分类Dev

RadGridView中单元格的值更改时如何触发事件?

来自分类Dev

文本框上的触发事件值更改

来自分类Dev

取消UISwitch的自动触发值更改事件

来自分类Dev

文本框上的触发事件值更改

来自分类Dev

在alpine.js中单击事件后触发更改事件

来自分类Dev

更改属性后,如何立即触发属性更改事件?

来自分类Dev

发布值更改后,不会触发onReceive

来自分类Dev

如何在引用可能更改值的子视图中触发值更改事件?

来自分类Dev

如何在Postgres事件触发器中获取更改后的表的名称?

来自分类Dev

HTML Textarea:值更改时如何通知(未触发输入事件)

来自分类Dev

值更改后如何创建新的顺序标志(在SQL中)

来自分类Dev

如何在更改事件或即时值更改事件中获取滑块的即时值/当前值

来自分类Dev

Textinput或Textarea值更改MeteorJS上的触发事件

来自分类Dev

变量值更改时触发事件

来自分类Dev

插入数字12时不会触发Datetimepicker值更改事件

来自分类Dev

插入数字12时未触发Datetimepicker值更改事件

来自分类Dev

检查用户是否触发了值更改事件

来自分类Dev

当特定选项的选择值未更改或值更改为特定选项时,如何使用Jquery触发事件

来自分类Dev

如何在JavaScript中动态更改的元素中触发事件

来自分类Dev

值更改后,Ember.Select无法触发可见

来自分类Dev

在Javafx 2.4.0中过渡停止后如何触发事件?

来自分类Dev

如何添加事件处理程序在sqlalchemy中提交事务后仅触发一次

来自分类Dev

如何添加事件处理程序仅在sqlalchemy中提交事务后触发一次

来自分类Dev

如何在Angular2中触发模型更改事件?

来自分类Dev

事件值更改后,ControlValueAccessor ngModel不更新

来自分类Dev

我可以使用什么事件来检测对象中的值更改并获取更改后的值的键?

来自分类Dev

我可以使用什么事件来检测对象中的值更改并获取更改后的值的键?

Related 相关文章

  1. 1

    jQuery中未触发值更改事件

  2. 2

    jQuery中未触发值更改事件

  3. 3

    RadGridView中单元格的值更改时如何触发事件?

  4. 4

    文本框上的触发事件值更改

  5. 5

    取消UISwitch的自动触发值更改事件

  6. 6

    文本框上的触发事件值更改

  7. 7

    在alpine.js中单击事件后触发更改事件

  8. 8

    更改属性后,如何立即触发属性更改事件?

  9. 9

    发布值更改后,不会触发onReceive

  10. 10

    如何在引用可能更改值的子视图中触发值更改事件?

  11. 11

    如何在Postgres事件触发器中获取更改后的表的名称?

  12. 12

    HTML Textarea:值更改时如何通知(未触发输入事件)

  13. 13

    值更改后如何创建新的顺序标志(在SQL中)

  14. 14

    如何在更改事件或即时值更改事件中获取滑块的即时值/当前值

  15. 15

    Textinput或Textarea值更改MeteorJS上的触发事件

  16. 16

    变量值更改时触发事件

  17. 17

    插入数字12时不会触发Datetimepicker值更改事件

  18. 18

    插入数字12时未触发Datetimepicker值更改事件

  19. 19

    检查用户是否触发了值更改事件

  20. 20

    当特定选项的选择值未更改或值更改为特定选项时,如何使用Jquery触发事件

  21. 21

    如何在JavaScript中动态更改的元素中触发事件

  22. 22

    值更改后,Ember.Select无法触发可见

  23. 23

    在Javafx 2.4.0中过渡停止后如何触发事件?

  24. 24

    如何添加事件处理程序在sqlalchemy中提交事务后仅触发一次

  25. 25

    如何添加事件处理程序仅在sqlalchemy中提交事务后触发一次

  26. 26

    如何在Angular2中触发模型更改事件?

  27. 27

    事件值更改后,ControlValueAccessor ngModel不更新

  28. 28

    我可以使用什么事件来检测对象中的值更改并获取更改后的值的键?

  29. 29

    我可以使用什么事件来检测对象中的值更改并获取更改后的值的键?

热门标签

归档