Как оптимизировать запросы к базе данных в цикле 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

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