使用django休息框架在数据库中高效保存60K记录



我有一个端点(例如http://localhost:8000/api/create/)它使用django-rest框架在mysql-db中创建新记录

视图.py

class CreateItem(viewsets.ModelViewSet):
.
.
.
def perform_create(self, serializer):
if serializer.is_valid():
serializer.save()

序列化程序.py

class CreateItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = '__all__'

现在我有一个要求,在小时间帧中,将在脚本的帮助下在此端点中发出60K的单独HTTP请求

我如何才能最有效地处理它,这将花费更少的时间和资源。

我读过关于Django原子和芹菜任务的文章,但完全不知道如何将其用于这些需求。

将非常感谢任何帮助

提前感谢

因此,最简单的方法是将代码封装在原子事务中。

from django.db import transaction
with transaction.atomic():
serializer.create() # This code goes where you are calling the serializer.create() function, NOT inside the serializer itself else it's useless

这样做的目的是缓冲所有插入,然后一次执行所有插入。

bulk_create甚至更快,但使用序列化程序无法做到这一点。

如果您想通过HTTP请求传递数据来创建对象,Celery不会这样做,因为您需要先将数据发送到Django。

但是,您可以通过在同一请求上创建多个对象来提高性能:

您可以创建一个操作bulk_create,并创建一个只有一个字段的BulkSerializerobjects = MySerializer(many=True)

试试这样的东西:

class CreateItem(viewsets.ModelViewSet):
.
.
.
@action(methods=["post"], detail=False)
def bulk_create(self, request):
serialized = BulkSerializer(data=request.data)
serialized.is_valid(raise_exception=True)
for validated_data in serialized.validated_data["objects"]:
# Create object here
return Response({"status": "ok"})

(您可以通过重用与create中相同的逻辑来改进这一点,使用一些try / except来处理失败,并使用MULTISTATUS来处理响应,但要点如下(

这样,你就可以创建你的模型,比如说,100乘100或1000乘1000。

最新更新