Python 使用SQLAlchemy时访问after_insert和before_insert事件挂钩内的关系

Python 使用SQLAlchemy时访问after_insert和before_insert事件挂钩内的关系,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,关于在SQLAlchemy事件挂钩中操纵关系,我有两个非常相关的问题。注意,我使用的是炼金术,基本上与下面相同的模型 1) edit我正在尝试为记录对象添加一个事件侦听器,以便在记录默认初始值设定项创建后,对记录实例中的人员执行某些操作。唯一的问题是do_action主体中的target没有附加people列表,而people列表在创建实例后出现。出现这种情况的原因是什么?对于do\u action,是否有解决办法 我的模型: record\u structure=db.Table( “记录结构

关于在SQLAlchemy事件挂钩中操纵关系,我有两个非常相关的问题。注意,我使用的是炼金术,基本上与下面相同的模型

1) edit我正在尝试为记录对象添加一个事件侦听器,以便在记录默认初始值设定项创建后,对记录实例中的
人员执行某些操作。唯一的问题是
do_action
主体中的
target
没有附加
people
列表,而
people
列表在创建实例后出现。出现这种情况的原因是什么?对于
do\u action
,是否有解决办法

我的模型:

record\u structure=db.Table(
“记录结构”,
db.Column('person\u id',db.Integer,db.ForeignKey('person.id')),
db.Column('record_id',db.Integer,db.ForeignKey('record.id'))
班级人员(db.Model):
__tablename_uuu='person'
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(64),unique=True,nullable=False)
课堂记录(数据库模型):
__tablename_uu='record'
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(64),unique=True,nullable=False)
人员=数据库关系(“人员”,次要=记录结构)
定义初始化(自我、姓名、人员):
self.name=名称
self.people=list()
self.people.extend(人)
@db.event.listens(记录'after_insert')
def do_操作(映射器、连接、目标):
打印(target.name)#输出“我的记录”
打印(len(target.people))#输出:0??
#对目标人物做点什么
我的负载为db.py

p1 = Person(name='tom')
p2 = Person(name='fred')
db.session.add(p1)
db.session.add(p2)
db.session.commit()
r = Record('my record', [p1, p2])
print(len(r.people)) # output: 2
db.session.add(r)
db.session.commit()

2) 如果有“after_insert”事件挂钩的解决方法。如果我用“before_insert”事件钩子替换钩子,是否有解决方法?

因此,我在1)中提供的代码完全正确,因此
len(target.people)==2
和2)也适用。我的原始代码略有不同,这就是导致len(target.people)==0的原因。
bookopender.records.append(self)
似乎导致过早插入,并导致
self.people
初始化为空列表。感谢@supershot尝试复制它

类记录(db.Model):
__tablename_uu='record'
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(64),unique=True,nullable=False)
人员=数据库关系(“人员”,次要=记录结构)
定义初始(自我、姓名、簿记员、人员):
self.name=名称
簿记员.记录.附加(自我)
self.people=list()
self.people.extend(人)

我想一个好的做法是将通过
self
的行放在
簿记员.records.append(self)
\uuuu init\uuuuu
的末尾,这样相关的数据就会被传递到事件挂钩。

r=Record('my Record',[p1,p2])
def\uu init\uuu(self,name,labels):
。您的人员列表正在传递到标签参数。哦,糟糕,这是一个输入错误。更新的问题我无法重现这个问题。当我运行代码时,
len(target.people)==2