首页 > 解决方案 > 批量更新不适用于文件字段上传 django

问题描述

我正在尝试更新 django 中 fileField 中的多个文件。我正在从数据库中获取对象,并通过迭代它们来分配新文件,然后将对象保存在列表中。如果我使用 bulk_update 它会更新所有字段,包括 FileFields 但不上传文件,如果我遍历每个对象并使用 .save(),那么它工作正常。

但是使用 .save() 函数会多次访问数据库。所以,我需要使用 bulk_update

代码

update_list = []
t_obj = FileFieldDetails.objects.filter(ques_key__in=q_key)
for t in t_obj.iterator():
    t.value = request.FILES[0]
    update_list.append(t)

# Not Working
FileFieldDetails.objects.bulk_update(update_list,['value'])

# Working
for i in update_list:
    i.save()

标签: djangodjango-modelsbulkupdate

解决方案


您可以将 for 循环包装在事务 atomic中。

原子性是数据库事务的定义属性。atomic 允许我们创建一个代码块,在其中保证数据库的原子性。如果代码块成功完成,则将更改提交到数据库。如果出现异常,则回滚更改。

像这样:

from django.db import transaction

with transaction.atomic():
    for i in update_list:
        i.save()

这可以帮助您减轻对数据库的影响


推荐阅读