[英]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.