Jak wspomniano bulk_create
nie wyzwala tych sygnałów -
https://docs.djangoproject.com/en/1.8/ref/models/querysets/#bulk-create
Metoda ta wstawia dostarczonego listę obiektów do bazy danych w sposób efektywny (zwykle tylko 1 zapytań, bez względu na to ile obiekty istnieją).
ten ma szereg zastrzeżeń choć: metoda
- modelu za save() nie zostanie wywołana, a sygnały pre_save i post_save nie zostanie wysłany.
- Nie działa z modelami podrzędnymi w scenariuszu dziedziczenia wielu tabel.
- Jeśli klucz podstawowy modelu to AutoField, nie pobiera on i nie ustawia atrybutu klucza głównego, jak to robi save().
- Nie działa z relacjami wiele do wielu.
- Parametr batch_size określa liczbę obiektów tworzonych w pojedynczym zapytaniu. Domyślnie tworzone są wszystkie obiekty w jednej partii, z wyjątkiem SQLite, gdzie domyślnie jest tak, że co najwyżej 999 zmiennych jest używanych na kwerendę.
Musisz więc uruchomić je ręcznie. Jeśli chcesz, to dla wszystkich modeli można zastąpić bulk_create
i wysłać je sam jak ten -
class CustomManager(models.Manager):
def bulk_create(items,....):
super().bulk_create(...)
for i in items:
[......] # code to send signal
Następnie za pomocą tego menedżera -
class Task(models.Model):
objects = CustomManager()
....