Как оптимизировать запросы к базе данных в цикле Django
Все доброго времени суток )
Подскажите как правильно решить задачу.
Есть CSV File который приходит с 1500+ позиций цен.
Данные из файла обновляют товары в базе данных, если товар подошел по критериям из данного CSV файла.
Товар 5к+, и тут вопрос справится не запирая запросы в цикле.
Ведь нужно взять условную 1 строчку файла пройтись по всем 5к+ товарам, найти совпадения, изменить данные.
Как оптимизировать ?
Вот мой нынешний код.
file = request.FILES['diamonds_data']
decoded_file = file.read().decode('utf-8').splitlines()
reader = csv.reader(decoded_file, delimiter=";")
# * get columns from row / create data
data = []
for row in reader:
# create data named object
data_object = {
'shape': '',
'clarity': '',
'color': '',
'weight_from': '',
'weight_to': '',
'rap_1ct': '',
'updated_date': '',
}
# get columns arr
columns = row[0].split(',')
# push column in to the data object
for index, col in enumerate(columns):
match index:
case 0:
data_object['shape'] = col
case 1:
data_object['clarity'] = col
case 2:
data_object['color'] = col
case 3:
data_object['weight_from'] = float(col.replace(',', '.'))
case 4:
data_object['weight_to'] = float(col.replace(',', '.'))
case 5:
data_object['rap_1ct'] = float(col.replace(',', '.'))
case 6:
data_object['updated_date'] = col
# append data objetc in data
data.append(data_object)
if file_shape == round_type:
query_set = Diamond_Model.objects.filter(shape=round_type)
shape_type = round_type
elif file_shape == pear_type:
query_set = Diamond_Model.objects.exclude(shape=round_type)
shape_type = pear_type
# * updated data in stones
for diamond in data:
filtered = query_set.filter(
Q(clarity=diamond['clarity']) &
Q(color=diamond['color']) &
Q(weight__gte = diamond['weight_from']) &
Q(weight__lte = diamond['weight_to'])
)
if filtered.exists():
for field in filtered:
field.rap_1ct = diamond['rap_1ct']
field.rap_price = round(field.weight * diamond['rap_1ct'], 0)
field.save()
pks.append(field.pk)
filtered.exclude(pk=field.pk)
updated += 1