Есть магазин. Есть товары приходящие в CSV файле.
Сейчас перебираю файл построчно. Строка = товар.
Если товара нет в БД, то добавляю. Если есть, то обновляю цену.
В итоге получаю кучу запросов на добавление, обновление. Хотя по сути, данные статичны и можно складировать в список ,а потом массово одним запросом скормить в БД. Как это сделать методами ОРМ джанги?
Цель:
Меньше обращений к БД, быстрее обрабатывается файл, меньше нагрузка на железо
Сейчас:file_url = './../file/items.csv'
with open(file_url, 'rb') as csvfile: # перебираем строки
spamreader = csv.reader(csvfile, delimiter='|', quoting=csv.QUOTE_MINIMAL)
for row in spamreader: # перебираем ячейки в строке
id_item = row['item'].replace("'", "")
item = Item.objects.filter(id_item=id_item)
if not item:
item = Item(id_item=id_item)
item.name = row['name'].replace("'", "")
....
else:
item = item[0]
item.price = row['price'].replace("'", "")
item.save()
Как видим, пробегая файл, каждый товар делает запрос в БД на получение товара, сохранение/обновление.
Часть логики моей, как вижу
К примеру проверку можно убрать, вытянув список всех товаров предварительно
all_item = Item.objects.all().values_list('id_item', flat=True)
И тогда уже завести два списка, куда сохранять товары предварительно, пробегая файл. Тупо проверяя есть ли значение в all_item
file_url = './../file/items.csv'
add_item = []
upd_item = []
with open(file_url, 'rb') as csvfile:
spamreader = csv.reader(csvfile, delimiter='|', quoting=csv.QUOTE_MINIMAL)
for row in spamreader:
id_item = row['id_item'].replace("'", "")
if id_item in all_item: # Та самая проверка
upd_item.append({'id_item': id_item, 'price': row['price'].replace("'", "")})
else:
add_item.append({'id_item': id_item, 'name': row['name'].replace("'", "")})
# Вот тут уже то самое добавление / обновление
# Item(add_item).save() or Item(upd_item).save()
Интересует как именно "правильно" собрать эти списки и как потом одним/двумя запросами скормить в базу. Всё методами ОРМ джанги, а не кастылями с прямыми запросами в БД.
З.Ы. В магазин приходит порядка 10-40к товаров за день на добавление/изменение. Иногда, бывает и под 100к товаров, когда новый поставщик добавляется. В магазине за пару месяцев в БД может висеть под 1кк товаров.