0

I am familiar wıth the DBMS_ALERT feature in Oracle that sends an alert to the Operating System when there is a change to the database, and am somewhat familiar with database triggers in general. I have browsed through the django docs on signals, and inclined to use them if there is not a simpler way.

All I want to do is update or create an external file on the systems file system whenever there is an update or created record in the database. I would like this method to be called and defined right in models.py as depicted below.

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

What would be the simplest method to implement the ondbchange_updatecorrfile(self) method above?

I have looked at the below code from 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)

Then foo is some function in another class that would update the file. Since the database Model is the class that is aware of the change in the Model's underlying database, do we really need to use a signal if the desired function is already in the model and "self aware" of the database change?

Any help deeply appreciated. Please be specific since the devil is in the details.

1 Answers1

0

The post_save signal is sent by the model Entry after a save, but according to this source, the signal does not include the model changes in its update_fields parameter. These must be manually inserted in the override of the function where the save() happens; which defeats the purpose. I initially assumed that the signal would automatically include this information.