Python SQLAlchemy侦听多对多关系中的属性更改,并更改启动器的其他属性

Python SQLAlchemy侦听多对多关系中的属性更改,并更改启动器的其他属性,python,sqlalchemy,crud,Python,Sqlalchemy,Crud,我是SQLAlchemy的新手,我编写了一个简单的CRUD数据库布局,如下所示:我有三个表,客户、产品和模板。其理念是:每个客户都可以拥有他通常订购的产品模板。当我从数据库中获取一个特定的客户时,他的模板以及所有的产品也应该被获取。所以我有一对一关系(客户模板)和一对多关系(产品模板)。现在,模板应该包含诸如特定产品的数量、净值、总值和税额等字段。我希望在quantity列上有一个侦听器,这样当某个特定产品的数量发生变化时,我提到的其他属性也会发生变化。因此,我编写的代码如下所示(如果可以的话,

我是SQLAlchemy的新手,我编写了一个简单的CRUD数据库布局,如下所示:我有三个表,客户、产品和模板。其理念是:每个客户都可以拥有他通常订购的产品模板。当我从数据库中获取一个特定的客户时,他的模板以及所有的产品也应该被获取。所以我有一对一关系(客户模板)和一对多关系(产品模板)。现在,模板应该包含诸如特定产品的数量、净值、总值和税额等字段。我希望在quantity列上有一个侦听器,这样当某个特定产品的数量发生变化时,我提到的其他属性也会发生变化。因此,我编写的代码如下所示(如果可以的话,请验证是否所有关系都正确编写)


现在,我不确定如何获取特定的启动器并设置其值,因为
模板
表中的
产品
是一个列表(?)

我可能会这样做。在无法访问我们都习惯使用的
会话
对象的情况下,很难使用Sqlalchemy orm

@event.listens_for(Template, "after_update")
def quantity_listener(mapper, connection, target):
    field = 'quantity'
    added, _, deleted = get_history(target, field)

    # added is a new values of the specified field
    # deleted is the old values
    # so we basically check if 'quantity' has changed
    # its a tuple btw

    if added and deleted and added[0] != deleted[0]:

        stmt = Template.update(). \
            values(Template.something=Template.something * Template.other_something). \
            where(Template.id == target.id)

        conn.execute(stmt)

        # here goes another updates for products or you can have another 
        # listener for them

也许有更好的方法来实现这一点。我现在无法调试,也无法让您的示例正常工作。希望有帮助。

我可能会这样做。在无法访问我们都习惯使用的
会话
对象的情况下,很难使用Sqlalchemy orm

@event.listens_for(Template, "after_update")
def quantity_listener(mapper, connection, target):
    field = 'quantity'
    added, _, deleted = get_history(target, field)

    # added is a new values of the specified field
    # deleted is the old values
    # so we basically check if 'quantity' has changed
    # its a tuple btw

    if added and deleted and added[0] != deleted[0]:

        stmt = Template.update(). \
            values(Template.something=Template.something * Template.other_something). \
            where(Template.id == target.id)

        conn.execute(stmt)

        # here goes another updates for products or you can have another 
        # listener for them

也许有更好的方法来实现这一点。我现在无法调试,也无法让您的示例正常工作。希望对您有所帮助。

您能详细说明一下您希望在
数量\u listener
中实现的具体目标吗?我想将产品的数量乘以该特定产品的净价,获得税和总值,并为该产品设置它们,并将它们保存到数据库中,我不知道是否很清楚,也不知道如何在集合中使用连接,但是如果您使用
(模板'after_update')
侦听更新,那么您将获得kwargs中的连接参数。连接是什么意思?你能给我写一个答案让我明白你的意思吗?当然,让我看看这些文件。你能详细说明一下你想在
数量\u listener
中完成什么吗?我想用产品的数量乘以这个特定产品的净价,获取此产品的税值和总值并设置它们,并将它们保存到数据库中,我不知道是否很清楚。不知道如何在集合中使用连接,但如果您使用
(模板“after_update”)
侦听更新,则您将获得kwargs中的连接参数。连接是什么意思?你能写一个答案让我明白你的意思吗?当然,让我看看文档。我怎样才能改进我的代码,使它整体上运行得更好?(你说你不能让它工作)我有一个例外,因为产品中没有
\uuu tablename\uu
。为了进行测试,您可以使用一个插入虚拟数据的函数。然后,如果这样做有效的话,它很容易调试。我的意思是在
模板中,而不是
产品中。Np.如何改进我的代码,使其整体工作得更好?(你说你不能让它工作)我有一个例外,因为产品中没有
\uuu tablename\uu
。为了进行测试,您可以使用一个插入虚拟数据的函数。然后,如果这样做有效的话,它很容易调试。我的意思是在
模板中,而不是
产品中。NP