问题描述
我很熟悉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()的函数的重写中。达不到目的。我最初以为信号会自动包含此信息。