Django中能否通过循环字段为模型实例批量赋值?
你的写法行不通,得这么改!
首先得明确:你当前的代码不会给foo1、foo2、foo3赋值,因为p.field中的field会被Python当成实例的一个字面量属性名,而不是你循环里的变量field的值。说白了,你这是给p加了个叫field的临时属性,和模型里的三个字段完全没关系。
正确的实现方式
要用Python内置的setattr()函数,它支持通过字符串形式的属性名来给对象设置值,刚好适配你这种循环赋值的场景:
fields = ['foo1', 'foo2', 'foo3'] p = Person() for field in fields: setattr(p, field, 5) # 第一个参数是对象,第二个是属性名字符串,第三个是值 p.save()
拓展小技巧
如果每个字段需要不同的值,可以用字典来批量处理,代码会更清晰:
field_value_map = { 'foo1': 10, 'foo2': 20, 'foo3': 30 } p = Person() for field, value in field_value_map.items(): setattr(p, field, value) p.save()
要是你是想批量更新数据库里的多个Person实例,还可以用QuerySet的update()方法,比如:
Person.objects.filter(...).update(foo1=5, foo2=5, foo3=5)
这种方式不用实例化对象,直接操作数据库,效率更高。
内容的提问来源于stack exchange,提问作者JM Lontoc
相关产品推荐
相关产品推荐

