我有一个端点(例如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
,并创建一个只有一个字段的BulkSerializer
:objects = 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。