反向级联规则不影响覆盖 mongoengine 对象的删除方法
Reverse cascade rule doesn't effects to overriden delete method of mongoengine object
我有两个文档对象(Job
和 JobLog
),一个引用了另一个(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()
[]
过了一会儿,我重写了 JobLog
的 delete
方法,如下所示:
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 的信号之前安装。
我有两个文档对象(Job
和 JobLog
),一个引用了另一个(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()
[]
过了一会儿,我重写了 JobLog
的 delete
方法,如下所示:
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 的信号之前安装。