针对多个记录的Django CRUD操作-transaction.atomic与bulk_create

针对多个记录的Django CRUD操作-transaction.atomic与bulk_create,django,Django,我有一个Django 1.10模型和一个简单模型: 我有一个简单的REST端点,用于测试目的: @api_view(['POST']) @transaction.atomic def r_test(request): for record in request.data: serializer = TestSerializer(data = record) if serializer.is_valid(): serializer.sa

我有一个Django 1.10模型和一个简单模型:

我有一个简单的REST端点,用于测试目的:

@api_view(['POST'])
@transaction.atomic
def r_test(request):
    for record in request.data:
        serializer = TestSerializer(data = record)
        if serializer.is_valid():
           serializer.save()
…执行100条记录需要9秒(太慢)

如果我按照下面的方式重写它,它会立即执行

@api_view(['POST'])
def r_test(request):
    obj_list = []
    for record in request.data:
       obj = Test(field1 = record['field1'])
       obj_list.append(obj)
    Test.objects.bulk_create(obj_list)
困扰我的是,我在许多资料中都读到,将函数包装到事务中(我通过添加decorator
@transaction.atomic
)将显著改进多个操作情况下的插入操作。但我现在看不到这个

所以问题是,只有bulk_create()能够提供插入大数据的超高速,还是我在
transaction.atomic
中做了一些错误的事情

更新:此外,我的设置中将
原子请求设置为
True
。顺便问一下,是不是设置有问题?比如说,Debug=True会阻止Django在单个事务中执行查询吗

更新2我尝试了使用decorator和使用transaction.atomic()将for循环包装在
中的两种方法:
。但我仍然只观察到使用
bulk\u create()


更新3。我的数据库是MySQL,对吗?我认为您应该首先改进api函数:

def r_test(request):
    serializer = TestSerializer(data=request.data, many=True)
    if serializer.is_valid():
       serializer.save()

请重试。

事务通常会加快插入过程。由于
ATOMIC\u REQUESTS=True
,您已经处于事务中,因此在使用
@transaction.ATOMIC()
时不会注意到差异。事务更快的主要原因是提交需要时间。在没有事务的情况下,Django使用自动提交模式,因此每个查询都会导致提交


在性能方面,事务并不是一个灵丹妙药。您仍在执行100个查询和100次到数据库的往返。即使您的数据库运行在同一个系统上,这也需要一些时间。这就是
bulk\u create
发挥作用的地方。它执行单个查询以一次插入所有数据。您刚刚为自己保存了99次数据库往返。这比事务引起的任何加速都重要。

可能不是问题,但您是否激活了django_debug_工具栏?我尝试过,但没有成功配置它,因为debug_工具栏在某些情况下会快速降低页面加载速度。特别是如果选中了SQL选项,你指的是什么页面?这只是一个REST端点。没有问题的页面我必须补充一点,如果您的数据库在同一个系统上,9秒100次查询仍然非常慢。若数据库在另一个系统上,那个么网络延迟可能会很快增加。不,数据库在另一个系统上。谢谢你的详细回答