Django中设置auto_now=True的字段在哪些场景下不会被更新?
Django
auto_now=True字段未触发更新的其他常见场景 auto_now=True的自动更新逻辑仅在Django ORM层执行单个模型实例的save()方法时触发,所有绕开该逻辑的操作都不会更新对应字段,除了你已经提到的QuerySet.update()、bulk_update()场景外,还有以下常见情况:
- 调用
bulk_create()做批量插入/ upsert操作时:如果使用update_conflicts参数实现存在即更新的批量操作,auto_now字段不会自动赋值,必须显式指定last_updated的更新规则才会生效。 - 仅修改关联字段的关联关系时:调用外键关联对象的修改方法、或者多对多字段的
add()、remove()、clear()、set()方法调整关联关系时,不会触发当前Contact实例的save()方法,因此last_updated不会更新。 - 实例加载时通过
only()/defer()排除了last_updated字段:此时哪怕调用实例的save()方法,Django也无法完成auto_now的自动赋值,该字段不会更新。 - 自定义
save()方法未调用父类逻辑:如果重写了Contact模型的save()方法,且没有执行super().save(*args, **kwargs),内置的auto_now赋值逻辑会被跳过,last_updated不会自动更新。 get_or_create()仅触发查询逻辑时:get_or_create只有在创建新对象时会自动设置auto_now字段,如果匹配到已有对象直接返回,不会触发更新操作。update_or_create()无实际字段变更时:如果匹配到的现有对象字段与defaults参数的取值完全一致,Django不会执行save()操作,last_updated也不会更新。- 更新操作对应的数据库事务回滚时:哪怕ORM层已经完成了
last_updated的赋值,只要最终事务回滚,该字段的更新也不会落库生效。
内容的提问来源于stack exchange,提问作者stranger
相关产品推荐
相关产品推荐

