Django多对多字段add操作调用与不调用save方法的区别是什么?
Django多对多字段两种操作写法的区别及底层原因
两种写法的核心区别
- 第二种写法是符合Django设计逻辑的标准用法,无冗余操作
- 第一种写法中的
group.save()是完全多余的调用,不会对多对多关系的存储产生任何额外效果
无需调用group.save()即可持久化的原因
Django的多对多关系不会存储在任意一张关联表的主字段中,而是会单独生成一张独立的中间关联表,专门用于存储两张关联表的主键映射关系。
当你执行group.reportedBy.add(request.user)时,Django会直接在这张中间表中执行INSERT语句,写入当前group实例和request.user实例对应的主键关联关系,该操作会直接提交到数据库,当场生效,不需要依赖主实例的保存操作。
而group.save()的作用仅为将group实例本身的普通字段(比如名称、创建时间等存储在group对应主表的字段)的变更同步到数据库,和多对多中间表的操作完全无关。
额外说明:不止add()操作,多对多字段的remove()、clear()、set()方法都是直接操作中间表,所有变更都会直接写入数据库,不需要调用关联主实例的save方法。
内容的提问来源于stack exchange,提问作者Abhishek AN
相关产品推荐
相关产品推荐

