Django ORM中Model.objects.create与Model.save()的差异及相关问题
Django ORM 问题解答
问题1:实例化后调用save()的对象,内存中id字段是否会更新?
当执行p2 = Person(name="Bob");p2.save()时,内存中的p2对象id字段会被自动更新。
Django在调用save()将对象写入数据库后,会把数据库自动生成的主键(此处为BigAutoField生成的id)同步回内存中的对象实例,和Person.objects.create()的效果完全一致——两种方式最终得到的内存对象都包含有效的id值。
问题2:使用不同方式创建的Person对象关联Business,是否有差异?
没有差异。
不管是通过create()直接创建的p1,还是先实例化再save()得到的p2,只要它们已经被保存到数据库(即拥有有效的主键id),将其传入Business的owner字段并执行save(),最终都会在Business表中正确存储对应的owner_id,关联到对应的Person记录。两种方式的执行逻辑和结果完全一致。
问题3:传入未保存的Person对象到Business并save,会发生什么?
Django会自动执行级联保存:
- 先将未保存的
p对象写入数据库,生成对应的id值; - 再将
b对象写入数据库,将其owner_id设置为刚生成的p的id,完成关联。
默认情况下,这两个操作会在同一个数据库事务中完成,确保数据一致性——如果其中任何一步失败,整个操作都会回滚。
内容的提问来源于stack exchange,提问作者de1337ed
相关产品推荐
相关产品推荐

