2011-02-02 6 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

Нет. Почему? Нет дублирования. Это потрясающе. И очень просто. И то, что все ожидают. Что вам не нравится? –

ответ

6

Вы должны использовать сигналы Django, чтобы вызвать определенную функцию до или после того, как модель будет сохранена или удалена (а также в других случаях, если это необходимо). Проверьте соответствующую документацию здесь: http://docs.djangoproject.com/en/dev/topics/signals/

Если переопределить методы модели, ваш delete() не будет вызываться при удалении объекта в объеме от QuerySet (см here).

Вы можете подключить несколько сигналов к тому же методу, используя signal.connect.

+0

Хорошая точка, объемные методы от менеджера часто выдает один запрос, а не сигналы пожара вообще. –

+1

Было бы здорово, если бы у этого ответа был пример, чтобы закончить его; прямо сейчас это всего лишь набор ссылок, которые пользователь должен посетить, чтобы получить ответ, вместо того, чтобы содержать ответ. См .: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

Смежные вопросы