更新对象的选择,每个对象具有不同的批量值(Django)

Has*_*aig 11 django django-orm

想象一下,我有一个python字典,其中键是现有用户ID,值是要添加到这些用户现有分数的分数.

例如:( {1: 1580, 4: 540, 2: 678}这可以拉伸到nk,v对)

我需要更新所有这些用户对象的分数(updated_score = original_score + new_score).一种方法是迭代,如下所示:

from django.db.models import F
scores = {1: 1580, 4: 540, 2: 678}
for user_id,score_to_add in scores.iteritems():
    UserProfile.objects.filter(user_id=user_id).update(score=F('score')+score_to_add)
Run Code Online (Sandbox Code Playgroud)

但那是多个数据库调用.我可以一次通话吗?一个说明性的例子会很棒.正如您所猜测的那样,这是一个Django项目.

nik*_*k_m 9

像这样的东西:

from django.db.models import F
from django.db import transaction

with transaction.atomic():
    scores = {1: 1580, 4: 540, 2: 678}
    for user_id,score_to_add in scores:
        UserProfile.objects.filter(user_id=user_id).update(score=F('score')+score_to_add)
Run Code Online (Sandbox Code Playgroud)

更多关于这里

你也可以看看这个答案.

[UPDATE]:

TL; DR:它不会生成一个db查询,但会更快,因为每个查询都缺少数据库开销.

正如文档和@ahmed在他的回答中所说:

Django的默认行为是在自动提交模式下运行.除非事务处于活动状态,否则每个查询都会立即提交到数据库.

通过使用with transaction.atomic()所有插入被分组到单个事务中.提交事务所需的时间在所有随附的insert语句中分摊,因此每个insert语句的时间大大减少.