一、问题说明
在我们给模型的时间字段updated_at
字段添加auto_now=True
之后,原则上来说在更新数据是会自动修改更新时间。
但是当我们使用在代码中使用ORM中的filter(xxx=xxx).update(xxx=xxx)
时发现,更新时间字段并没有完成更新。
而如果使用obj.save()
或通过ModelViewSets接口发起更新操作时,updated_at
字段是可以更新的。
二、具体原因
出现上述问题的原因在于,obj.save()
操作直接走了Django
的Model
层、触发了auto_now
机制,而走前端接口访问时也同样经过了模型的序列化操作,
而对于上面的filter(xxx=xxx).update(xxx=xxx)
,通过打印SQL我们可以看出,这类update
操作是单纯被转换为了SET SQL
,并没有经过Model
层,自然也就没有对updated_at
字段更新了。
三、解决方法
解决方法很简单,只需要在进行update
操作时,在更新字段中加上:
ModelName.objects.filter(xxx=xxx,
).update(xxx=xxx.updated_at=datetime.dattime.now()
)