2017-11-30 93 views
8

TL; DR:
Muszę sposób wyzwalania sygnału niestandardowego po sygnale post_save automatycznie, czy jest jakiś sposób to zrobić?Jak wysłać sygnał django z innego sygnału


Jestem obecnie rozwija bibliotekę dla Django, który wymaga dużo przychodzi i odchodzi z sygnałem post_save w Django i zastanawiałem się, czy to możliwe, aby wywołać kolejny sygnał popost_save więc mogłem realizować własne i nie interweniować na post_save w przypadku, gdy projekt, który korzysta z biblioteki, musi to zrobić.

Do tej pory wiem, że sygnały mają odebrać klasę jako argument nadawcy, a jeśli wyzwolę ręcznie sygnał z post_save, nic nie zrobię (nadal będę interweniować). Czy istnieje jakieś obejście tego problemu? Czy brakuje mi czegoś w dokumentach?

+0

* Dlaczego * potrzebujesz niestandardowego sygnału? Jeśli to, co musisz zrobić, dzieje się za każdym razem, gdy coś jest zapisane, po prostu użyj sygnału 'post_save'. Nie ma znaczenia, czy użyjesz wszystkich argumentów przekazanych do obsługi sygnału. – solarissmoke

+0

Hej, @ OrcarCarballal Zastanawiałem się, czy moja odpowiedź była pomocna? –

+0

Tak, przepraszam, zupełnie zapomniałem o oznaczeniu tego. Dzięki :) –

Odpowiedz

6

Chociaż może to być możliwe poprzez wywołanie sygnału ręcznie od wewnątrz innego sygnału jak ten:

post_save.send(MyModel, instance=a_mymodel_instance) 

Są łatwiejsze sposoby, aby zrobić coś takiego:

Załóżmy, że postępujesz zgodnie z plik organizacja że używam w tej odpowiedzi: Django Create and Save Many instances of model when another object are created


Propozycja 1:

  • Załóżmy, że Twoja pierwsza post_save robi coś MyModel1 i kolejny sygnał post_save robi coś MyModel2 po pewnym przetwarzania na przykład, który wywołał pierwszy sygnał.
  • post_save jest zawsze wysyłane pod koniec z metody save().
  • Uporządkuj swoje sygnały w następujący sposób:

    @receiver(post_save, sender=MyModel1) 
    def mymodel1_signal (sender, instance, **kwargs): 
        Do stuff on MyModel1 instance... 
        Do also stuff on MyModel2 and then call MyModel2.save() 
    
    
    @receiver(post_save, sender=MyModel2) 
    def mymodel2_signal (sender, instance, **kwargs): 
        Do stuff on MyModel2 instance... 
    

    ten sposób sygnał mymodel2_signal dostanie wyzwalane po wywołaniu MyModel2.save() od mymodel1_signal.


Propozycja 2:

  • użyć kombinacji sygnałów w celu uzyskania prawidłowej "czasu".
  • Załóżmy, że chcesz rozpocząć proces na MyModel2 przed MyModel1 get zapisane
  • Użyj pre_save i post_save sygnału:

    @receiver(pre_save, sender=MyModel1) 
    def mymodel1_signal (sender, instance, **kwargs): 
        Do stuff on MyModel1 instance... 
        Do also stuff on MyModel2 and then call MyModel2.save() 
    
    
    @receiver(post_save, sender=MyModel2) 
    def mymodel2_signal (sender, instance, **kwargs): 
        Do stuff on MyModel2 instance... 
    

Sugestia 3:

Użyj MyModel2 Metoda bezpośrednio wewnątrz sygnału MyModel1post_save.

+0

podczas pracy z wieloma instancjami możemy użyć kanału django do trigerowania zadania offline, aby to zrobić. – Hayden

+0

@Hayden Nie mam w tej chwili doświadczenia z kanałami django. To, co mówisz, wydaje się interesujące :) –

Powiązane problemy