Как индексировать объекты `bulk_create`d в django, haystack? [Дубликат]

sc.nextLine() лучше по сравнению с анализом ввода. Потому что производительность разумна, это будет хорошо.

13
задан user3214546 3 June 2015 в 23:49
поделиться

2 ответа

Как уже упоминалось, 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()
    ....
12
ответ дан brainless coder 4 September 2018 в 09:35
поделиться

Итерация по ответу выше:

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()
    ....

Полный ответ в 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
0
ответ дан Felipe Sens 4 September 2018 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: