反向级联规则不影响覆盖mongoengine obj的delete方法

2024-06-01 21:10:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个document对象(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时。在

^{pr2}$

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

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时,重写的delete方法没有调用。在

^{pr2}$

引用的JobLog已删除,但未调用重写的delete方法。在


Tags: 对象方法fieldsdbrequiredjobdeleterule
1条回答
网友
1楼 · 发布于 2024-06-01 21:10:58

我最后给出了一个解决方案,如果有人遇到这种问题,我会和大家分享。在

我不知道为什么被重写的delete方法没有被调用,但是基本的Document类将继承的类看作Document类,并调用它的超级类方法。因此未调用重写的delete方法。在

解决方案是使用signals来确保在delete和save等方法之前或之后处理的操作。这个片段对我有用:

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信号之前,请确保已安装。在

相关问题 更多 >