Django:基于计算的批量更新

Django:基于计算的批量更新,django,orm,sql-update,Django,Orm,Sql Update,我有一个Django应用程序,显示用户可以投票的照片。为了使事情更简单,我已经对数据进行了非规范化,以便照片对象具有current\u rating和current\u rank字段。每当进行新投票时,我想更新所有对象上的current\u rank字段,但我不确定如何避免在循环中这样做。我怎样做: i = 1 for p in Photo.objects.order_by("-current_rating"): p.current_rank = i p.save() i

我有一个Django应用程序,显示用户可以投票的照片。为了使事情更简单,我已经对数据进行了非规范化,以便照片对象具有
current\u rating
current\u rank
字段。每当进行新投票时,我想更新所有对象上的
current\u rank
字段,但我不确定如何避免在循环中这样做。我怎样做:

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

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

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

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

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

您需要将此行添加到settings.py中的中间件类中

'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_。有关更多详细信息,请参阅上面的文档。

肯定是好东西,我会的,但我实际上是想看看是否有一种方法可以通过像@Tom I See这样的F()对象进行批量更新。我想你要找的东西可以在这里的文档中找到(在那一段的底部,就在相关对象的上方):。。。如果这是你要找的,我会更新我的answer@JamesR这就是我所引用的:这个例子展示了一种增加现有字段的方法,但是看起来没有一种方法可以动态地批量更改字段。