2015-06-03 14 views
13

Ho questo codiceCome posso usare i segnali alla rinfusa Django creare

Task.objects.bulk_create(ces)

Ora, questo è il mio segnale

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

Ora, questo segnale non viene attivato in massa creare

Sto usando django 1.8

risposta

12

Come detto bulk_create non fa scattare questi segnali -

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

Questo metodo inserisce l'elenco fornito di oggetti nel database in modo efficace (in genere solo 1 domanda, non importa quante oggetti ci sono).

Questo ha una serie di avvertimenti però: metodo

  • del modello save() non sarà chiamato, ed i segnali pre_save e post_save non verrà inviato.
  • Non funziona con i modelli figlio in uno scenario di ereditarietà a più tabelle.
  • Se la chiave primaria del modello è un campo automatico, non recupera e imposta l'attributo chiave primaria, come fa save().
  • Non funziona con le relazioni molti-a-molti.
  • Il parametro batch_size controlla il numero di oggetti creati in una singola query. L'impostazione predefinita prevede la creazione di tutti gli oggetti in un lotto, , ad eccezione di SQLite, in cui il valore predefinito è tale che vengono utilizzate al massimo 999 variabili da per query.

Quindi è necessario attivarli manualmente. Se si desidera che questo per tutti i modelli è possibile ignorare la bulk_create e inviare voi stessi come questo -

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

quindi utilizzare questo manager -

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