Sygnały zapisywania / usuwania są ogólnie korzystne w sytuacjach, w których trzeba wprowadzić zmiany, które nie są całkowicie specyficzne dla danego modelu lub można je zastosować do modeli, które mają coś wspólnego lub można je skonfigurować do użycia w różnych modelach.
Jednym z typowych zadań w zastępowanych save
metodach jest automatyczne generowanie informacji o pracy z jakiegoś pola tekstowego w modelu. To jest przykład czegoś, co, jeśli trzeba by go zaimplementować dla wielu modeli, skorzystałoby na użyciu pre_save
sygnału, w którym program obsługi sygnału mógłby wziąć nazwę pola informacji o pracy i nazwę pola, z którego ma wygenerować informacje o pracy. Gdy już masz coś takiego, każda wprowadzona ulepszona funkcjonalność będzie miała również zastosowanie do wszystkich modeli - np. Wyszukanie ślimaka, który masz zamiar dodać dla danego typu modelu, aby zapewnić wyjątkowość.
Aplikacje wielokrotnego użytku często czerpią korzyści z wykorzystania sygnałów - jeśli dostarczaną przez nie funkcjonalność można zastosować do dowolnego modelu, generalnie (chyba że jest to nieuniknione) nie będą chcieli, aby użytkownicy musieli bezpośrednio modyfikować swoje modele, aby z nich skorzystać.
Z Django mptt , na przykład, użyłem pre_save
sygnału zarządzać zestaw pól opisujących strukturę drzewa dla modelu, który ma zamiar być tworzone lub aktualizowane i pre_delete
sygnał do usunięcia drzew szczegóły konstrukcji dla obiektu przed usunięciem i całej jego poddrzewo obiektów znajdujących się przed nim i są one usuwane. Ze względu na użycie sygnałów, użytkownicy nie muszą dodawać ani modyfikować save
ani delete
metod w swoich modelach, aby wykonać to zarządzanie, po prostu muszą poinformować django-mptt, którymi modelami chcą zarządzać.
Zapytałeś:
Czy byłoby jakieś korzyści z używania dyspozytora sygnału Django?
Znalazłem to w dokumentacji django:
Od: nadpisywanie predefiniowanych metod modelu
źródło
save
metody”?Jeśli użyjesz sygnałów, będziesz mógł aktualizować wynik recenzji za każdym razem, gdy powiązany model oceny zostanie zapisany. Ale jeśli nie potrzebuję takiej funkcjonalności, nie widzę żadnego powodu, aby umieszczać to w sygnale, to całkiem związane z modelem.
źródło
To rodzaj denormalizacji. Spójrz na to ładne rozwiązanie . Definicja pola kompozycji w miejscu.
źródło
Mały dodatek z dokumentacji Django o usuwaniu zbiorczym (
.delete()
metoda naQuerySet
obiektach):https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects
I zbiorcza aktualizacja (
.update()
metoda naQuerySet
obiektach):https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update
źródło