Joh*_*yes 6 python django signals
在以下示例代码中:
from django.db import models
from django.db.models.signals import pre_save
# Create your models here.
class Parent(models.Model):
name = models.CharField(max_length=64)
def save(self, **kwargs):
print "Parent save..."
super(Parent, self).save(**kwargs)
def pre_save_parent(**kwargs):
print "pre_save_parent"
pre_save.connect(pre_save_parent, Parent)
class Child(Parent):
color = models.CharField(max_length=64)
def save(self, **kwargs):
print "Child save..."
super(Child, self).save(**kwargs)
def pre_save_child(**kwargs):
print "pre_save_child"
pre_save.connect(pre_save_child, Child)
Run Code Online (Sandbox Code Playgroud)
pre_save_parent
我创建一个Child时不会触发:
child = models.Child.objects.create(color="red")
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?
有关于此的公开票,#9318.
你的解决方法看起来很好.以下是benbest86和alexr分别在票上建议的其他两个.
听取子类信号,并在那里发送父信号.
def call_parent_pre_save(sender, instance, created, **kwargs):
pre_save.send(sender=Parent, instance=Parent.objects.get(id=instance.id), created=created, **kwargs)
pre_save.connect(call_parent_pre_save, sender=Child)
Run Code Online (Sandbox Code Playgroud)连接信号时不要指定发送方,然后检查父类的子类.
def pre_save_parent(sender, **kwargs):
if not isinstance(instance, Parent):
return
#do normal signal stuff here
print "pre_save_parent"
pre_save.connect(pre_save_parent)
Run Code Online (Sandbox Code Playgroud)