【问题标题】:Optimizing CSV file processing in POST request (Django Rest Framework)优化 POST 请求中的 CSV 文件处理(Django Rest Framework)
【发布时间】:2020-01-25 21:30:26
【问题描述】:

我有一个发布请求,它采用 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)

【问题讨论】:

标签: python django csv django-rest-framework


【解决方案1】:

如果这是一个大文件,并且您正在执行一个大插入,那么这应该在 Django 使用的请求-响应周期之外完成。

我建议为此在您的项目中集成一个异步任务队列,因此请查看 Celery、redis-queue 和 huey。

此外,您正在以一种非常未优化的方式执行此操作,并且可以在 django ORM 中使用 bulk_create 来减少单个插入的数量以支持批量操作。

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2020-07-14
    • 2018-09-22
    • 2019-09-12
    相关资源
    最近更新 更多