DjangoQuerySet.update
は を処理せずtransaction.commit_manually
、自動的にコミットします。
このようなカスタマイズされたdjangoビューを作成しました...
クラス Foo(ビュー)
@method_decorator(transaction.commit_manually)
def post(self, request, *args, **kwargs):
try:
Model.objects.all().update(rank=10)
data_to_update = resquest.
for d in data_to_update:
model = Model.objects.get(pk=d['id'])
model.rank = d['rank']
model.save()
transaction.commit()
status_code = 200
except Exception, e:
# do some stuff
transaction.rollback()
status_code = 500
return HttpResponse(content='Foo', status=status_code)
...そして、 の後に期待が高まるとModel.objects.all().update(rank=10)
、transaction.rollback()
は適切に機能せず、すべてのモデルでランクが 10に設定されます。
なぜそれが起こるのかわかりません。また、すべてのモデルで反復することはできません。それぞれにsaveメソッドを呼び出します(パフォーマンス上の理由)。