环境
Python 3.7.6
Django 2.2.16
先后顺序
执行保存操作时,先执行 save_model,再执行保存数据的触发操作 post_save ,最后执行 save_related。若其中任何一个步骤出错,任何数据都不会被保存到数据库。
情况概述
- 无 ManyToManyField 多对多字段的 Model:在执行保存操作时,执行 post_save,正常。
- 有 ManyToManyField 多对多字段的 Model:在执行保存操作时,执行 post_save,会出现以下两种情况:
- 若 post_save 操作中不需要获取或操作 ManyToManyField 多对多字段,则正常。
- 若 post_save 操作中需要获取或操作 ManyToManyField 多对多字段,则错误,无法获取到 ManyToManyField 多对多字段的数据。因为此时 save_related 并没有被执行,ManyToManyField 多对多字段数据根本未被保存,则无法获取到数据。
解决
在 save_related 执行后,在执行某些操作。仅可实现部分操作。示例代码:
def save_related(self, request, form, formsets, change):
form.save_m2m()
for formset in formsets:
self.save_formset(request, form, formset, change=change)
if not change: # 若 instance 实例被创建,则继续
obj = form.instance # 获取 obj 实例
pass
思维僵化
最初将 post_save 的理解为:在数据保存后,才会进行的操作。即,点了保存按钮后,数据写入数据库后,才会执行的操作。
遇到此问题时(post_save 无法获取到 ManyToMany 多对多字段的的数据),导致一直在所搜索 post_save 与 save_related
执行的先后,或者说怎么才能让 post_save 在 save_related 后执行。导致思维僵化,有了局限性,浪费了很多时间。。。
在喝了杯咖啡,聊了会天后,突然想起来,可以尝试在 save_related 之后将 ManyToMany 多对多字段的数据执行保存操作后,再在保存操作代码之后进行其他操作。