【发布时间】: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)
【问题讨论】:
-
也许 io.StringIO 是问题所在。看看at this question关于文件对象并试一试。
-
这类问题更适合codereview.stackexchange.com
标签: python django csv django-rest-framework