add如何使django post_save信号仅在创建期间运行 [英] addHow to make django post_save signal run only during creation

查看:98
本文介绍了add如何使django post_save信号仅在创建期间运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的项目中使用django-notifications,我想在使用信号创建模型时通知特定用户,但是在更新模型时post_save也会运行,我如何防止这种情况并且仅使创建模型后运行post_save方法。



models.py

  class Card(models.Model):
用户= models.ForeignKey(User,on_delete = models.CASCADE)
title = models.CharField(max_length = 100)
description = models.TextField (空白=真)
列表=模型.ForeignKey(列表,related_name ='卡片')
story_points =模型.IntegerField(空=真,空白=真)
业务值=模型.IntegerField (空=真,空白=真)

def __str __(self):
return Card:{}。format(self.title)

def my_handler(发件人,实例,**假):
如果instance.pk为None:
notify.send(instance.user,收件人= User.objects.get(pk = 1),target =实例,verb ='create d')

post_save.connect(my_handler,sender = Card)

我尝试使用if instance.pk为None,但是当我添加此条件时,它根本不运行。

  def my_handler(发件人,实例,创建的,**假的):
如果创建的话:
notify.send(instance .user,receiver = User.objects.get(pk = 1),target = instance,动词='created')


解决方案

有一个已创建的命名参数,如果它是一个新对象,则将其设置为True。



有一个看看这里- https://docs.djangoproject.com/en/1.10 / ref / signals /#post-保存

  def my_func(发送方,实例,创建的,** kwargs) :
print( Created:,created)

class MyModel(models.Model):
x = models.CharField(max_length = 255)

p ost_save.connect(my_func,sender = MyModel)

>> MyModel.objects.create(f ='asdf')
创建:True
>>> m = MyModel.objects.all()。first()
>>> m.x
'asdf'
>>> m.x =‘a’
>>> m.save()
创建:False


I'm using django-notifications in my project and I want to notify a particular user whenever a model is created using the signal, but the post_save also runs when a model is being updated how do I prevent this and only make the post_save method run when a model is created.

models.py

class Card(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    description = models.TextField(blank=True)
    list = models.ForeignKey(List, related_name='cards')
    story_points = models.IntegerField(null=True, blank=True)
    business_value = models.IntegerField(null=True, blank=True)

    def __str__(self):
        return "Card: {}".format(self.title)

def my_handler(sender, instance, **kwargs):
    if instance.pk is None:
        notify.send(instance.user, recipient=User.objects.get(pk=1),   target=instance, verb='created')  

post_save.connect(my_handler, sender=Card)    

I tried using if instance.pk is None, but when I add this condition it doesn't run at all.

EDITED: The code checking if created

def my_handler(sender, instance, created, **kwargs):
    if created:
        notify.send(instance.user, recipient=User.objects.get(pk=1), target=instance, verb='created')  

解决方案

There is a created named argument which will be set to True if it's a new object.

Have a look here - https://docs.djangoproject.com/en/1.10/ref/signals/#post-save

def my_func(sender, instance, created, **kwargs):
    print("Created: ", created)

class MyModel(models.Model):
    x = models.CharField(max_length=255)

post_save.connect(my_func, sender=MyModel)

>>> MyModel.objects.create(f='asdf')
Created:  True
>>> m = MyModel.objects.all().first()
>>> m.x
'asdf'
>>> m.x = 'a'
>>> m.save()
Created:  False

这篇关于add如何使django post_save信号仅在创建期间运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆