Django视图中如何通过变量指定修改模型对应数据库字段的值
你原来的写法不生效是因为Python对象的点属性访问语法中,点后的标识符会被当作固定的属性名字面量处理,不会解析为对应变量的值,所以你写instance_model.i的时候,程序会直接尝试访问实例的i字段,而不是把i的值作为目标字段名。
解决方案
方法1:使用Python内置setattr()函数(单实例更新场景首选)
setattr()是Python原生支持的动态属性赋值方法,参数格式为setattr(对象实例, 字段名字符串, 要设置的值),完全适配你的需求。
先修正你示例代码中的几个基础问题:
- 不要用
list作为变量名,这是Python内置关键字,会覆盖原生方法 - 字段名需要以字符串格式存入列表,否则会被识别为未定义变量
- 字段列表和值列表要对应索引,或直接用字典映射降低出错概率
修正后的完整代码如下:
models.py(无需调整)
class ExampleModel(models.Model): name = models.CharField(max_length=10) a = models.CharField(max_length=10) b = models.CharField(max_length=10) c = models.CharField(max_length=10)
views.py
# 字段名用字符串格式存储,避免使用保留关键字作为变量名 field_list = ["a", "b", "c"] fruits = ["orange", "apple", "banana"] def ExampleView(request): model_instance = ExampleModel.objects.last() # 同时遍历字段名和对应的值 for field, value in zip(field_list, fruits): # 动态给对应字段赋值 setattr(model_instance, field, value) # 所有字段赋值完成后统一保存,减少数据库IO次数 model_instance.save()
如果字段和值的对应关系固定,更推荐用字典存储映射关系,写法更简洁:
field_value_map = { "a": "orange", "b": "apple", "c": "banana" } def ExampleView(request): model_instance = ExampleModel.objects.last() for field, value in field_value_map.items(): setattr(model_instance, field, value) model_instance.save()
方法2:使用QuerySet的update()方法(批量/无需查实例场景首选)
如果不需要先获取实例做其他逻辑处理,可以直接调用查询集的update()方法,配合字典解包实现动态更新,仅执行一次SQL操作,性能更高:
field_value_map = { "a": "orange", "b": "apple", "c": "banana" } def ExampleView(request): # 过滤出目标记录后直接更新,无需手动调用save target_pk = ExampleModel.objects.last().pk ExampleModel.objects.filter(pk=target_pk).update(**field_value_map)
内容的提问来源于stack exchange,提问作者user13137381
相关产品推荐
相关产品推荐

