Django:基于计算的批量更新

时间:2012-03-01 18:35:29

标签: django orm sql-update

我有一个Django应用程序,显示用户可以投票的照片。为了简化操作,我对数据进行了非规范化处理,以便照片对象具有current_ratingcurrent_rank个字段。我想在每次投票时更新所有对象的current_rank字段,但我不确定如何避免在循环中这样做。我该怎么做:

i = 1
for p in Photo.objects.order_by("-current_rating"):
    p.current_rank = i
    p.save()
    i += 1

作为ORM中的一个更新操作?

1 个答案:

答案 0 :(得分:7)

我认为你的意思是事务管理器中的一个事务,而不是每次迭代一个事务。

我相信循环结构很好,但你需要做的是控制事务管理器。

首先,您需要使用Django事务管理器,您可以在这里阅读:

https://docs.djangoproject.com/en/dev/topics/db/transactions/

您需要将此行添加到settings.py

中的middleware_classes
'django.middleware.transaction.TransactionMiddleware',

然后,您需要在上述功能所在的位置导入交易;

from django.db import transaction

将循环放入函数中并添加装饰器,如下所示:

@transaction.commit_on_success
def my_function():
    i = 1
    for p in Photo.objects.order_by("-current_rating"):
        p.current_rank = i
        p.save()
    i += 1

现在,当调用该函数时,它只有一个事务,而不是N.如果失败,事务就会回滚。

您也可以使用commit_manually。有关详细信息,请参阅上面的文档。

相关问题