我有一个Django应用程序,显示用户可以投票的照片。为了简化操作,我对数据进行了非规范化处理,以便照片对象具有current_rating
和current_rank
个字段。我想在每次投票时更新所有对象的current_rank
字段,但我不确定如何避免在循环中这样做。我该怎么做:
i = 1
for p in Photo.objects.order_by("-current_rating"):
p.current_rank = i
p.save()
i += 1
作为ORM中的一个更新操作?
答案 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。有关详细信息,请参阅上面的文档。