2017-11-30 3 views
0

DB内のすべてのオブジェクトに対してDjangoモデルのパラメータを更新したいとします。値は各オブジェクトごとに異なります。バッチ更新として実行できるかどうか、または各アイテムを繰り返し処理してそれぞれを個別に保存する必要があるかどうかを確認しようとしています。私はすべてのオブジェクトを取得する場合モデル内のすべてのオブジェクトのパラメータを更新する方法 - Django

from django.contrib.auth.models import User 
from django.db import models 

class Profile(models.Model): 
    user = models.OneToOneField(User) 
    position = models.PositiveIntegerField(null=False, default=0) 

次のように:

queryset = User.objects.all() 

その後、これらをループし、更新position

私が使用しているモデルは、Djangoの認証ユーザモデルを拡張したものです:

for user in queryset: 
    user.position = #SOME FUNCTION 

私は内user.save()を行う必要がありますループ?または、各アイテムを更新して一度にすべてをDBに保存できますか?

答えて

1

Djangoには一括更新はありませんが、実行できるのは、アトミックトランザクションを使用して、すべての更新ステートメントを1回コミットしてパフォーマンスを向上させることです。

from django.db import transaction 

with transaction.atomic(): 
    for user in queryset: 
     user.position = #SOME FUNCTION 
     user.save() 

はまだlen(queryset)挿入があるでしょうが、彼らは1つのトランザクションにグループ化されます。

+0

すごく、私のことを指摘してくれてありがとう。 – Rob

+1

ちょうどuser.positionとuser.save()ステートメントがこれにインデントされるべきであることに気づいた。何らかの理由で編集できない – Rob

+0

@Robもちろん、thx! – crhodes

関連する問題