0

I am implementing a notification system in my django application for which i am using signals (post_save).

I am recording the changes in overridden save method of the model and returning it. My query is that how can i catch it in function written for post_save .

Relevant code snippets:

myapp/models.py:

class MyModel(models.Model):
        # fields
        #
        #
        def save(self, *args, **kw): #overridden save method
            old = type(self).objects.get(pk=self.pk) if self.pk else None
            super(MyModel, self).save(*args, **kw)
            if old and old.attr != self.attr: # Field has changed
                 return something
        #
        #

myapp/views.py:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from webpush import send_user_notification

@receiver(post_save, sender=MyModel)
def notifier(sender, instance, created, **kwargs):
    # how to catch the return values of save here ##
    payload = {"head": "Welcome!", "body": "Hello World"}
    send_user_notification(user=User.objects.all()[0], payload=payload, ttl=1000) 
    #here User.objects.all()[0] for test user 

post_save.connect(receiver=notifier,sender=MyModel)
Kundan
  • 21
  • 2

1 Answers1

0

You have to save that 'something' in the model instance like this:

in myapp/models.py:

class MyModel(models.Model):
  # fields
  #
  #
  def save(self, *args, **kw): #overridden save method
    old = type(self).objects.get(pk=self.pk) if self.pk else None
    super(MyModel, self).save(*args, **kw)
    if old and old.attr != self.attr: # Field has changed
      self._something = something

Then in your myapp/views.py change the receiver method like this:

@receiver(post_save, sender=MyModel)
def notifier(sender, instance, created, **kwargs):
  # how to catch the return values of save here ##
  something = instance._something #your something
  payload = {"head": "Welcome!", "body": "Hello World"}
  send_user_notification(user=User.objects.all()[0], payload=payload, ttl=1000) 
  #here User.objects.all()[0] for test user 
Freeky
  • 810
  • 4
  • 14