Создание характеристик для большого количества товаров
Доброе время суток!
Задача создать в базе данных значения характеристик (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 часа... Есть ли возможность ускорить данный код?