Django:基于计算的批量更新
我有一个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
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这就是我所引用的:这个例子展示了一种增加现有字段的方法,但是看起来没有一种方法可以动态地批量更改字段。