反向级联规则不影响覆盖 mongoengine 对象的删除方法

Reverse cascade rule doesn't effects to overriden delete method of mongoengine object

我有两个文档对象(JobJobLog),一个引用了另一个(JobLog 的引用字段指向 Job)。引用定义为 reverse_delete_rule=CASCADE

# Job class
class Job(db.Document):
    (fields)

class JobLog(db.Document):
    (fields)
    job = ReferenceField(Job, required=True, reverse_delete_rule=CASCADE)

当我删除 Job 对象并引用 JobLog 安全删除。

>>> job = Job()
>>> job.save()
>>> job_log = JobLog()
>>> job_log = job
>>> job_log.save()
>>> job.delete()

>>> JobLog.objects().all()
[]

过了一会儿,我重写了 JobLogdelete 方法,如下所示:

class JobLog(db.Document):
    (fields)
    job = ReferenceField(Job, required=True, reverse_delete_rule=CASCADE)

    def delete(self, signal_kwargs=None, **write_concern):
        (some operations)
        print("Delete method called.")
        super(JobLog, self).delete(signal_kwargs, **write_concern)

但是删除时 Job 覆盖的删除方法没有调用。

>>> job = Job()
>>> job.save()
>>> job_log = JobLog()
>>> job_log = job
>>> job_log.save()
>>> job.delete()

>>> JobLog.objects().all()
[]

引用的 JobLog 已删除但未调用覆盖的 delete 方法。

我最终找到了解决方案,如果有人遇到此类问题,我会分享它。

我不知道为什么重写的 delete 方法没有被调用的所有细节,但似乎基础 Document class 将继承的 class 视为 Document class 并调用它的超级 class 方法。所以重写的删除方法没有被调用。

解决方案是使用 signals 来确保在删除和保存等方法之前或之后处理操作。这段代码对我有用:

class JobLog(db.Document):

    @classmethod
    def pre_delete(cls, sender, document, **kwargs):
        (pre delete operations)

from mongoengine import signals
signals.pre_delete.connect(JobLog.pre_delete, sender=JobLog)

信号支持由blinker库提供。确保在使用 mongoengine 的信号之前安装。