sqlalchemy — event.listens_for(Parent.child, «добавить») не вызывается при добавлении дочернего элемента

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

Я создаю базу данных в sqlalchemy, и мне нужно обновить родительские задания при добавлении дочернего анализа в таблицу. Я пытаюсь использовать event.listens_for(Jobs.child, "append") , но функция никогда не вызывается.

Модель базы данных и слушателей выглядит следующим образом:

 # parent
class Jobs(db.Model):
    __tablename_ = 'jobs'
    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
    child = relationship("Analysis", backref="jobs", lazy='dynamic', cascade="all, delete-orphan")
    user_id = db.Column(UUID(as_uuid=True), nullable=False)
    # 0 = nothing
    # 1 = 2d
    # 2 = 3d
    stage = db.Column(db.Integer, default=0)
    # 0 = idle
    # 1 = pending
    # 2 = running
    # 3 = finished
    # -1 = failure
    status = db.Column(db.Integer, default=0)
    action_required = db.Column(db.Boolean, default=False)

    def serialize(self):
        return {
            "id": str(self.id),
            "status": self.status,
            "stage": self.stage,
            "action_required": self.action_required
        }


# child
class Analysis(db.Model):
    __tablename_ = 'analysis'
    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
    parent_id = db.Column(UUID(as_uuid=True), ForeignKey('jobs.id'))
    analysis_type = db.Column(db.Integer, nullable=False)
    cancel = db.Column(db.BOOLEAN, default=False)
    result_code = db.Column(db.Integer, default=0)
    output_data = db.Column(db.String)
    __mapper_args__ = {'polymorphic_on': analysis_type}


class Analysis2D(Analysis):
    __mapper_args__ = {'polymorphic_identity': 1}
    num_people = db.Column(db.Integer, default=0)


class Analysis3D(Analysis):
    __mapper_args__ = {'polymorphic_identity': 2}
    person_id = db.Column(db.Integer, default=0)


db.create_all()


@event.listens_for(Jobs.child, "append")
@event.listens_for(Jobs.child, 'remove')
def receive_append_or_remove(target, value, initiator):
    print("This code is not reached.")
    target.stage = value.analysis_type
  

Затем я добавляю объект экземпляра Analysis2D через:

 analysis_2d = Analysis2D(parent_id=my_id)
db.session.add(analysis_2d)
db.session.commit()
  

Даже когда я добавляю объект типа Analysis в базу данных, прослушиватель событий не работает.