如何通过Django admin面板仅更新数据库指定列?
Django仅更新temp表c列的实现方法
你完全可以通过django-import-export在admin页面实现仅更新特定列的需求,不会改动a、b列的已有数据,以下是可直接落地的操作方案,适合Django初学者使用。
方案1:Admin端配置django-import-export(最贴合你的使用习惯)
这个方案不需要你脱离熟悉的admin后台操作,全程可视化,出错概率低:
- 安装依赖:执行命令
pip install django-import-export安装包,打开项目的settings.py,把import_export添加到INSTALLED_APPS列表中,再执行python manage.py collectstatic收集静态资源,重启Django服务。 - 配置导入规则:打开temp表对应app下的
admin.py文件,自定义导入资源类,限定仅更新目标字段,代码参考如下:
from import_export import resources from import_export.admin import ImportExportModelAdmin from django.contrib import admin from .models import Temp # 替换为你项目中temp表对应的模型类名 class TempCColumnResource(resources.ModelResource): class Meta: model = Temp # 字段列表只保留「行匹配唯一字段」+「待更新的c字段」 # 行匹配字段选能唯一标识每一行的字段即可,比如主键id、或者不重复的a列 fields = ('id', 'c') # 指定用哪个字段匹配数据库中已存在的记录,避免重复新建数据 import_id_fields = ('id',) # 未在fields中声明的a、b列不会做任何修改 @admin.register(Temp) class TempAdmin(ImportExportModelAdmin): resource_class = TempCColumnResource # 保留你之前写的其他admin配置即可
- 准备导入文件:把你存了c列数据的Excel做精简,只保留两列:一列是上面配置的匹配字段(比如id,值必须和数据库中temp表现有数据一一对应),另一列是c列的待填充值,列名要和模型里的字段名完全一致。
- 执行导入:进入Django admin的temp表管理页,点击右上角「导入」按钮上传处理好的Excel,跟着页面引导确认导入即可,整个过程只会更新匹配行的c字段,a、b列原有数据完全不受影响。
操作前建议先备份temp表现有数据,哪怕配置出错也能快速回滚。
方案2:通过Django Shell批量更新(无需修改admin配置)
如果你不想额外配置admin,也可以直接用Django交互环境完成更新:
- 把存了c列数据的Excel另存为UTF-8编码的CSV文件,文件里同样保留匹配用的id列和c列即可。
- 在项目根目录执行命令
python manage.py shell进入Django交互终端。 - 执行以下代码完成批量更新:
import csv from .models import Temp # 替换为你的temp表模型类 # 括号内替换为你自己的CSV文件路径 with open("c_column_data.csv", "r", encoding="utf-8") as csv_file: reader = csv.DictReader(csv_file) objs_to_update = [] for row in reader: temp_record = Temp.objects.get(id=row["id"]) temp_record.c = row["c"] objs_to_update.append(temp_record) # 仅批量更新c字段,不触碰其他列 Temp.objects.bulk_update(objs_to_update, ["c"])
代码执行完成就完成了全部50行数据的c列填充。
方案3:MySQL原生操作(可选)
如果你熟悉MySQL语法,也可以把Excel导出为CSV后,通过创建临时表关联更新temp表的c列,不过对初学者来说前两种方案更稳妥,不需要直接操作数据库,避免误操作。
内容的提问来源于stack exchange,提问作者wizard
相关产品推荐
相关产品推荐

