簡體   English   中英

優化 POST 請求中的 CSV 文件處理(Django Rest Framework)

[英]Optimizing CSV file processing in POST request (Django Rest Framework)

我有一個 post 請求,它接受一個 CSV 文件並將此文件中的所有有效數據保存到 DB 模型。 但它非常慢,因為 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)

如果這是一個大文件,並且您正在執行大插入操作,那么這應該在 Django 使用的請求-響應周期之外完成。

為此,我建議將異步任務隊列與您的項目集成,因此請查看 Celery、redis-queue 和 Huey。

此外,您以一種非常未優化的方式執行此操作,並且可以在 django ORM 中使用 bulk_create 來減少單個插入的數量以支持批量操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM