繁体   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