2011-02-02 75 views
2

当添加或删除Foo类型的对象时,我需要执行相同的计算。如何检测Foo模型的对象的添加/删除?例如:如何检测Django模型的对象何时添加/删除?

from django.db import models 

class Foo(models.Model): 
    ... 
    def save(self): 
     #do some processing 

    def delete(self): 
     #do some processing 

我能避免这两个方法的代码重复?

使用信号可以实现像

from django.db import models 
from django.db.models.signals import post_save, post_delete 

class Foo(models.Model): 
    ... 
    ... 

def foo_handler(sender, **kwargs):  
    #do some processing 

post_save.connect(foo_handler, sender=Foo) 
post_delete.connect(foo_handler, sender=Foo)  
+0

号为什么?没有重复。太棒了。而且非常简单。每个人都期待什么。你不喜欢它什么? – 2011-02-02 11:04:50

回答

6

你应该使用Django的信号之前或之后的模型被保存或删除(以及在其他时间,如果需要的话)来调用特定的功能。点击这里,查看相关文件:http://docs.djangoproject.com/en/dev/topics/signals/

如果覆盖模型方法,您从一个QuerySet批量删除对象时delete()将不会被调用(见here)。

您可以使用signal.connect将多个信号连接到相同的方法。

+0

好处是,管理员的批量方法通常只发出一个查询,而不是发出信号。 – 2011-02-02 09:52:15