2016-07-24 18 views
0

Wir haben ein Modell:Django Signal auf Methodenaufruf (nicht Modellinstanz Triggerung)

class Item(model.Model): 
    pass 

    def items_red(self): 
     # filter items by red color 
     # model instance is NOT changed (saved) 
     pass 

Ich brauche Item.items_red() Methodenausführung mit Django Signal zu fangen. Irgendwelche Vorschläge, wie man das macht? items_red Modellinstanz in keiner Weise ändern.

Antwort

3

Sie benötigen ein eigenes Signal zu definieren:

import django.dispatch 

items_red_executed = django.dispatch.Signal() 

class Item(model.Model): 
    pass 

    def items_red(self): 
     # filter items by red color 
     # model instance is NOT changed (saved) 
     items_red_executed.send(sender=self.__class__) 

dann einen Empfänger:

from django.dispatch.dispatcher import receiver 

@receiver(items_red_executed, sender=Item) 
def my_receiver(**kwargs): 
    print(kwargs.get('sender')) 

Weitere Informationen zum documentation beziehen.

+0

Thx für eine Erklärung, ich benutze Signale nicht viel. Aber jetzt verstehe ich es ein wenig Overhead und würde nur zusätzliche Methode erstellen, und triggern eine in 'items_red' –

+0

Ich glaube nicht, dass Sie sich viel sorgen müssen, in DB-gesteuerten Anwendungen der größte Engpass wird in der Regel durch Ihre verursacht DB-Leistung. – rafalmp

+0

Dennoch sollte Code so explizit wie möglich sein. Es hilft, wenn Sie Ihr Projekt nach ein paar Monaten der Programmierung unterstützen –

Verwandte Themen