Создание характеристик для большого количества товаров

Доброе время суток!

Задача создать в базе данных значения характеристик (10-15) для большого количества (15k+) товаров.

Проблема состоит в слишком долгой работе ф-и (add_item_specs), которая добавляет в БД значения характеристик. Не много сокращенный код выглядит так:

# models.py

class Item(models.Model):
    brand = models.CharField(max_length=250, blank=True, default="")
    code = models.CharField(max_length=10, db_index=True, blank=True)
    ...

class SpecItem(models.Model):
    """
    Характеристики товара
    """
    code = models.CharField(max_length=20, verbose_name="Код характеристики", unique=True)
    title = models.CharField(max_length=200, verbose_name='Наименование характеристики')
    ...

class SpecValue(models.Model):
    """
    Занчение характеристики
    """
    item = models.ForeignKey('Item', on_delete=models.CASCADE, related_name='spec_value')
    spec_item = models.ForeignKey('SpecItem', on_delete=models.CASCADE, related_name='value')
    value = models.CharField(max_length=150, verbose_name="Значение", null=True)
# services.py
def add_item_specs(items: dict):
    # ВЫБИРАЮ ТОВАРЫ ИЗ БД ДЛЯ КОТОРЫХ БУДУ ДОБАВлЯТЬ ХАР-КИ
    items_in_db = Item.objects.filter(code__in=items.keys()) 
    count_items = items_in_db.count()
    # ДЛЯ ПРОПУСКА УЖЕ СУЩЕСТВУЮЩИХ ЗНАЧЕНИЙ ХАР-К
    exists_spec_values = SpecValue.objects.all().values_list('item', 'spec_item__code')
    all_specs = SpecItem.objects.all()
    spec_objects = list()
    for item in items_in_db:
        for spec in items[item.code]["Features"]:
            if (item.pk, spec['FeatureCode']) in exists_spec_values:
                # ПРОПУСКАЮ СУЩЕСТВУЮЩИЕ
                continue
            spec_item = all_specs.get(code=spec['FeatureCode'])
            spec_value = SpecValue(
                item=item,
                spec_item=spec_item,
                value=spec['FeatureValue'] if spec['FeatureValue'] is not None else ""
                )
            spec_objects.append(spec_value)
        count_items -= 1
        # Данное сообщение выводится примерно 1-2 раза в секунду 
        print(f"Добавлены характеристики для {item.title} \n\t>> Осталось => {count_items}")
    print(f'SpecValue.objects.bulk_create(spec_objects) => {len(spec_objects)=} значений характеристик заливается в БД')
    SpecValue.objects.bulk_create(spec_objects)

То есть еще до записи в БД код работает почти 2,5 часа... Есть ли возможность ускорить данный код?

Вернуться на верх