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项目.
像这样的东西:
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语句的时间大大减少.
| 归档时间: |
|
| 查看次数: |
4519 次 |
| 最近记录: |