首页 > 解决方案 > 在 django 中为 post_save 编写的自定义函数中捕获覆盖保存函数的返回值

问题描述

我正在使用信号(post_save)的 django 应用程序中实现通知系统。

我正在记录save模型的覆盖方法的变化并返回它。我的问题是我如何才能在为post_save.

相关代码片段:

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
        #
        #

我的应用程序/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)

标签: djangodjango-modelsdjango-viewsdjango-signals

解决方案


您必须像这样在模型实例中保存“某些东西”:

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

然后在您的myapp/views.py中更改接收器方法,如下所示:

@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 

推荐阅读