Django中ArrayField字段无法更新的技术咨询
为什么Django ArrayField赋值后不生效?
这是个很常见的小坑,我来帮你拆解下问题所在:
核心原因:直接通过QuerySet索引操作会导致临时实例被丢弃
你当前的操作是直接用x[0]来修改字段,但每次访问x[0]时,QuerySet都会返回一个全新的实例对象(或者说你修改的是一个临时创建的实例,没有被保存到变量里)。
举个直白的例子:当你执行x[0].X = [1,2,2,1]时,确实修改了某个实例的X字段,但这个实例是临时生成的,没有被你存储下来。当你再次执行x[0].X时,相当于又从数据库里取了一个新的实例,自然还是原来的默认值。
正确的操作步骤
你需要先把实例赋值给一个独立变量,再进行修改和保存:
>>> from productsHome.models import Views >>> # 把实例存到变量里,确保后续操作的是同一个对象 >>> obj = Views.objects.all()[0] >>> # 修改字段值 >>> obj.X = [1,2,2,1] >>> # 这时候内存里的实例已经更新了 >>> obj.X [1, 2, 2, 1] >>> # 别忘了保存到数据库,不然重启或重新查询后会变回原值 >>> obj.save()
额外提醒:ArrayField默认值的避坑点
你提到设置了默认值[0,0,0,0,0,0,0,0,0,0],这里要注意Python可变默认参数的陷阱!如果你的模型定义是这样的:
X = ArrayField(models.IntegerField(blank=True), default=[0]*10)
那所有新创建的Views实例会共享同一个列表对象,修改其中一个实例的X会意外影响其他实例的默认值。正确的做法是用可调用对象生成默认值:
X = ArrayField(models.IntegerField(blank=True), default=lambda: [0]*10)
这样每次创建实例时都会生成一个全新的列表,避免共享问题。
内容的提问来源于stack exchange,提问作者ThatMan
相关产品推荐
相关产品推荐

