У меня есть пост-запрос, который принимает файл CSV и сохраняет все действительные данные в этом файле в моделях БД. Но это невероятно медленно, потому что файлы CSV могут быть огромными. Есть ли лучший способ сделать это?
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
file = serializer.validated_data['file']
decoded_file = file.read().decode()
io_string = io.StringIO(decoded_file)
reader = csv.reader(io_string)
for row in reader:
if check_deal_validity(row):
try:
Client.objects.get(username=row[0])
except ObjectDoesNotExist:
client = Client(username=row[0])
client.save()
try:
Item.objects.get(name=row[1])
except ObjectDoesNotExist:
item = Item(name=row[1])
item.save()
deal = Deal(
client=Client.objects.get(username=row[0]),
item=Item.objects.get(name=row[1]),
total=row[2],
quantity=row[3],
date=row[4],
)
deal.save()
Client.objects.filter(username=deal.client).update(spent_money=F('spent_money') + deal.total)
if check_item_existence_for_client(
client=deal.client,
item=deal.item
):
pass
else:
deal.client.gems.add(deal.item)
return Response(status=status.HTTP_204_NO_CONTENT)