Django:当数据库发生更改时,异步执行某些功能的最简单方法是什么?

问题描述

我很熟悉Oracle中的DBMS_ALERT功能,该功能会在数据库发生更改时向操作系统发送警报,并且通常对数据库触发器有所了解。我浏览了有关信号的django文档,如果没有更简单的方法,我倾向于使用它们。

只要数据库中有更新或创建的记录,我要做的就是在系统文件系统上更新或创建一个外部文件。我希望可以在models.py中调用并定义此方法,如下所示。

models.py

from django.db import models
from django.shortcuts import reverse

class Entry(models.Model):
subject = CharField(max_length=20,unique=True)
content = models.TextField(blank=False)

class Meta:
    ordering = ['subject']

def __str__(self):
    """String for representing the Model object."""
    return self.subject

def get_absolute_url(self):
    """Returns the url to access a detail record for this entry."""
    return reverse('entry_detail',args=[int(self.id)])

def ondbchange_updatecorrfile(self):
    # this method would be called upon change in the model Entry,so it is already aware of object
    util.save_entry(self.subject,self.content) # file corresponding to row is updated or created

实现上述ondbchange_updatecorrfile(self)方法最简单的方法是什么?

我看过this source

中的以下代码

models.py

class Entry(models.Model):
...

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save,sender=Entry)
def queue_task(sender,instance,created,**kwargs):
tasks.foo.delay(object=instance)

然后foo是另一个类中的某个函数,它将更新文件。由于数据库模型是知道模型基础数据库中更改的类,因此,如果所需功能已经在模型中并且“知道”数据库更改,我们真的需要使用信号吗?

任何帮助深表感谢。请具体说明,因为细节在其中。

解决方法

保存后,模型Entry发送了post_save信号,但是根据this source,该信号在其update_fields参数中不包括模型更改。必须将这些手动插入到发生save()的函数的重写中。达不到目的。我最初以为信号会自动包含此信息。