Подтвердить что ты не робот

Как я могу использовать сигналы в django bulk create

У меня есть этот код

Task.objects.bulk_create(ces)

Теперь это мой сигнал

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

Теперь этот сигнал не запускается при массовом создании

Я использую django 1.8

4b9b3361

Ответ 1

Как уже упоминалось, bulk_create не вызывает эти сигналы -

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

Этот метод вставляет предоставленный список объектов в базу данных в эффективный способ (обычно только 1 запрос, независимо от того, сколько объекты есть).

У этого есть несколько предостережений:

  • Метод save() не будет вызываться, а сигналы pre_save и post_save не будут отправлены.
  • Он не работает с дочерними моделями в сценарии наследования с несколькими таблицами.
  • Если первичный ключ модели - это AutoField, он не извлекает и не устанавливает атрибут первичного ключа, как это делает save().
  • Он не работает с отношениями "многие ко многим".
  • Параметр batch_size определяет, сколько объектов создается в одном запросе. По умолчанию создается все объекты в одной партии, кроме SQLite, где значение по умолчанию таково, что не более 999 переменных для каждого запроса.

Таким образом, вы должны запускать их вручную. Если вы хотите, чтобы это для всех моделей, вы можете переопределить bulk_create и отправить их себе так:

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

Затем используйте этот менеджер -

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