¿Cómo puedo usar señales en django bulk create?

Tengo este codigo

Task.objects.bulk_create(ces)

Ahora esta es mi señal

 @receiver(pre_save, sender=Task) def save_hours(sender, instance, *args, **kwargs): logger.debug('test') 

Ahora esta señal no se dispara a granel crear

Estoy usando django 1.8

Como se mencionó, bulk_create no dispara estas señales –

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#bulk-create

Este método inserta la lista proporcionada de objetos en la base de datos de una manera eficiente (generalmente solo una consulta, sin importar cuántos objetos haya).

Esto tiene una serie de advertencias, sin embargo:

  • No se llamará al método save () del modelo, y no se enviarán las señales pre_save y post_save.
  • No funciona con modelos secundarios en un escenario de herencia de varias tablas.
  • Si la clave principal del modelo es un Campo Automático, no recupera ni establece el atributo de la clave principal, como lo hace save ().
  • No funciona con relaciones de muchos a muchos.
  • El parámetro batch_size controla cuántos objetos se crean en una sola consulta. El valor predeterminado es crear todos los objetos en un lote, excepto en SQLite, donde el valor predeterminado es tal que se utilizan como máximo 999 variables por consulta.

Así que tienes que activarlos manualmente. Si desea esto para todos los modelos, puede anular bulk_create y enviarlos de esta manera:

 class CustomManager(models.Manager): def bulk_create(items,....): super().bulk_create(...) for i in items: [......] # code to send signal 

Entonces usa este administrador –

 class Task(models.Model): objects = CustomManager() .... 

Iterando en la respuesta anterior:

Python 2:

 class CustomManager(models.Manager): def bulk_create(self, objs, **kwargs): #Your code here return super(models.Manager,self).bulk_create(objs,**kwargs) 

Python 3:

 class CustomManager(models.Manager): def bulk_create(self, objs, **kwargs): #Your code here return super().bulk_create(objs,**kwargs) 

 class Task(models.Model): objects = CustomManager() .... 

Respuesta completa en python 2:

 class CustomManager(models.Manager): def bulk_create(self, objs, **kwargs): a = super(models.Manager,self).bulk_create(objs,**kwargs) for i in objs: post_save.send(i.__class__, instance=i, created=True) return a